IT이야기

C # Winforms 굵은 리뷰 노드가 전체 텍스트를 표시하지 않을 경우

cyworld 2021. 3. 28. 09:35
반응형

C # Winforms 굵은 트 리뷰 노드가 전체 텍스트를 표시하지 않음


내 트리 노드를 굵게 만들기 위해 다음 코드를 사용하고 있습니다.

Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);

foreach (QuestionnaireBuilder_Category cat in categories)
{
    TreeNode node = new TreeNode();

    node.Text = cat.Description;
    node.Name = cat.Id.ToString();

    node.NodeFont = font;

    tvQuestionSequence.Nodes.Add(node);
}

그러나 굵은 노드의 텍스트는 올바르게 표시되지 않습니다. 마지막 문자는 표시되지 않습니다. 어째서? 이 문제를 해결하는 방법은 무엇입니까?


나는 똑같은 문제에 직면했기 때문에 웹을 검색 할 때이 게시물을 발견했습니다.

그러나 노드 끝에 공백을 추가하는 것은 옵션이 아니기 때문에 문제를 해결할 수있는 다른 방법을 찾았습니다.

노드 글꼴을 Bold로 설정 한 후 동일한 값으로 노드 텍스트를 재설정하기 만하면됩니다.

다음은 코드 샘플입니다.

Font boldFont = new Font(treeview.Font, FontStyle.Bold);
node.NodeFont = boldFont;
node.Text = node.Text;

텍스트를 변경 한 후 노드가 다시 그려지는 것 같습니다.


이것이 Windows 문제라는 것을 확인했습니다. 이 문제에 대한 해결 방법은 다음과 같습니다.

양식 생성자에서 트 리뷰의 글꼴을 굵게 설정합니다. 굵게 표시되지 않아야하는 노드를 추가 할 때 글꼴을 일반으로 변경하십시오.

// Constructor of your form
public Form() 
{
    InitializeComponent();

    Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);
    tvQuestionSequence.Font = font;
}

// Add regular nodes (not bold)
Font font = new Font(tvQuestionSequence.Font, FontStyle.Regular);

TreeNode treeNode = new TreeNode();
treeNode.Text = "Foo";
treeNode.NodeFont = font;

TreeNode parent = tvQuestionSequence.Nodes.Find("parent", true);
parent.Nodes.Add(treeNode);

노드를 굵게 표시하기 전에 treeView.BeginUpdate ()를 사용하고 노드를 굵게 표시 한 후 treeView.EndUpdate ()를 사용하십시오.


이것은 알려진 Windows 버그입니다. 간단한 해결책은 문자열 끝에 추가 공백 문자를 추가하는 것입니다. 공백 문자는 표시되지 않지만 문자열을 그리는 데 필요한 픽셀 수가 증가하므로 전체 문자열이 표시됩니다.


이것은 모두 나를 돕지 않습니다. 트릭은 디자인 타임에 글꼴을 조금 더 크고 굵게 만드는 것입니다. (속성 창에서)

따라서 충분히 큰 글꼴로 트 리뷰를 정의했는지 확인한 다음 나중에 더 작은 글꼴로 노드를 추가 할 수 있습니다. 그들은 맞을 것입니다.


제공된 솔루션에 동의합니다. 나는 문제가 무엇인지에 대해 조금 더 밝힐 수 있도록 그것에 추가하고 싶습니다. 트 리뷰에는 루트 수준에서 항목의 너비를 결정하는 자체 글꼴이 있습니다. 이는 사용 가능한 항목 높이 속성 만 있고 항목 너비 속성이 없다는 사실을 보완합니다.

문제에 대한 해결책은 루트 노드의 글꼴이 무엇인지 확인한 다음 트리를 동일한 글꼴로 설정하는 것입니다. 디자인 타임에도 그렇게 할 수 있습니다.

누군가에게 도움이되기를 바랍니다.


이 문제에 대한 해결 방법은 다음과 같습니다.

속성에서 treeview의 기본 글꼴을 굵게 설정합니다.

그리고 필요할 때 대담하지 않게 변경하십시오.


다음을 수행하고, 호출 할 DrawNode 이벤트를 설정하고, 노드를 굵게 설정하고 강조 표시된 색상을 제거합니다.

e.Graphics.FillRectangle 함수의 첫 번째 매개 변수를 사용하여 원하는 색상을 설정할 수 있습니다.

private void SetNodeBoldWhenSelected(object sender, DrawTreeNodeEventArgs e)
{
    if (e.Node == null) return;
    var font = e.Node.NodeFont ?? e.Node.TreeView.Font;
    if (e.Node.IsSelected)
    {
        font = new Font(font, FontStyle.Bold);                
    }

    var bounds = new Rectangle( e.Bounds.X,e.Bounds.Y,e.Bounds.Width+20,e.Bounds.Height);

    e.Graphics.FillRectangle(SystemBrushes.ControlDarkDark, bounds);
    TextRenderer.DrawText(e.Graphics, e.Node.Text, font, bounds, SystemColors.HighlightText, TextFormatFlags.GlyphOverhangPadding);
}

이제 노드를 선택하면 글꼴에 대해 20 픽셀 이상의 공간이 확보됩니다. 이것은 잘 작동합니다. 필요한 "실제"크기를 계산할 수 있지만이를 수행해야한다는 사양은 없지만 Graphics.MeasureString을 사용할 수 있습니다. 그렇게해야한다고 생각합니다.


매우 쉽고 잘 작동합니다.

treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold);
           this.treeView1.SelectedNode.Text += string.Empty;

나는 이것이 오래된 스레드라는 것을 알고 있으며 대답했을 수도 있습니다. 나는 TreeViews를 사용하는 법을 배우 면서이 문제를 만났습니다. 나를 위해 일한 것은 전체 TreeView의 글꼴 크기를 동일한 크기로 변경하거나 굵게하려는 수준의 글꼴보다 크게 변경하는 것입니다. 기본 글꼴 크기는 8입니다. 내 노드를 원하는 크기 인 10으로 변경했고 잘림이 사라졌습니다.


나를 위해 일한 것 : Control의 생성자에서 load 이벤트에 연결하고 BlunT의 답변에 설명 된대로 노드를 조정했습니다.

public MyControl()
{
    InitializeComponent();
    _head = new TreeNode();

    this.Load += (s, e) =>
    {
        trvParts.Nodes.Clear();
        _head.NodeFont = new Font(trvParts.Font, FontStyle.Bold);
        trvParts.Nodes.Add(_head);
        _head.Text = "Node Name";
    };
}

vb.Net에 있지만 TEXT 필드의 값을 다시 입력하는 솔루션은이 문제를 해결합니다. 에서와 같이 :

 With myNode
        Dim myText As String = .Text 'capture the text
        .NodeFont = New Font(<name of your treeview>.Font, FontStyle.Bold)
        .Text = myText 'reset the text to the original value
 End With

MSDN Library를 기반으로 코드를 다음과 같이 변경하십시오.

Font font = new Font(tvQuestionSequence.Font, FontStyle.Bold);

foreach (QuestionnaireBuilder_Category cat in categories)
{
    TreeNode node = new TreeNode();

    node.Text = cat.Description;
    node.Name = cat.Id.ToString();

    node.NodeFont = font;

    tvQuestionSequence.BeginUpdate();  //added newline here  <--
    tvQuestionSequence.Nodes.Add(node);
    tvQuestionSequence.EndUpdate();  //added newline here <--
}

그것은 나를 위해 일합니다

참조 URL : https://stackoverflow.com/questions/2272493/c-sharp-winforms-bold-treeview-node-doesnt-show-whole-text

반응형