web-dev-qa-db-ja.com

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);
}

ただし、太字のノードのテキストは正しく表示されません。最後の文字は表示されません。どうして?そして、この問題を解決する方法は?

53
Martijn

これは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);
19
Martijn

私はまったく同じ問題に直面しているので、ウェブを検索するときにこの投稿を見つけました。

ただし、ノードの最後に空白を追加することはオプションではなく、問題を解決する別の方法を見つけました。

ノードフォントを太字に設定したら、ノードテキストを同じ値にリセットするだけです。

コードサンプルは次のとおりです。

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

テキストを変更した後、ノードが再描画されるようです。これは、まさに私が最初に望んでいたものです。

60
BlunT

ノードを太字にする前にtreeView.BeginUpdate()を使用し、ノードを太字にした後treeView.EndUpdate()を使用します。

7
YoungStacker

これはWindowsの既知のバグです。簡単な解決策は、ストリングの最後に余分なスペース文字を追加することです。スペース文字は表示されませんが、文字列の描画に必要なピクセル数が増えるため、文字列全体が表示されます。

5
Adel Hazzah

提供されたソリューションに同意します。私はそれを追加して、問題が何であるかをもう少し明らかにしたいと思います。ツリービューには、ルートレベルでアイテムの幅を決定する独自のフォントがあります。これは、アイテムの高さプロパティのみが使用可能であり、アイテムの幅プロパティが存在しないという事実を補います。

問題の解決策は、ルートノードのフォントを決定し、ツリーをその同じフォントに設定することです。設計時にも行うことができます。

それが誰かを助けることを願っています。

3
user3161309

これはすべて私を助けていません。何DIDトリックは、デザイン時にフォントを少し大きく太字にすることです。(プロパティウィンドウで)

そのため、ツリービューを十分な大きさのフォントで定義してから、後で小さなフォントでノードを追加できます。彼らは収まります。

3
Bappie

この問題の回避策は次のとおりです。

プロパティでツリービューのデフォルトのフォントを太字に設定します。

必要に応じて太字にしないように変更します。

2
Ismael

以下を実行し、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を使用できますあなたはそれをする必要があると感じます。

1
PPann

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
0
planetblu

これは古いスレッドであり、回答された可能性があります。 TreeViewsの使用方法を学んでいるときに、この問題に出くわしました。私のために働いたのは、TreeView全体のフォントサイズを同じサイズに変更するか、太字にするレベルのフォントより大きくすることでした。デフォルトのフォントサイズは8です。私は10に変更しました。これは、ノードに必要なサイズでしたが、切り捨てはなくなりました。

0
user5868650

非常に簡単で問題なく動作します

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

私のために働いたのは:コントロールのコンストラクターでロードイベントにフックし、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";
    };
}
0
sean.net

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 <--
}

それは私のために働く

0
Romi Ardiansya