次のコードを使用して、ツリーノードを太字にします。
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);
}
ただし、太字のノードのテキストは正しく表示されません。最後の文字は表示されません。どうして?そして、この問題を解決する方法は?
これは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);
私はまったく同じ問題に直面しているので、ウェブを検索するときにこの投稿を見つけました。
ただし、ノードの最後に空白を追加することはオプションではなく、問題を解決する別の方法を見つけました。
ノードフォントを太字に設定したら、ノードテキストを同じ値にリセットするだけです。
コードサンプルは次のとおりです。
Font boldFont = new Font(treeview.Font, FontStyle.Bold);
node.NodeFont = boldFont;
node.Text = node.Text;
テキストを変更した後、ノードが再描画されるようです。これは、まさに私が最初に望んでいたものです。
ノードを太字にする前にtreeView.BeginUpdate()を使用し、ノードを太字にした後treeView.EndUpdate()を使用します。
これはWindowsの既知のバグです。簡単な解決策は、ストリングの最後に余分なスペース文字を追加することです。スペース文字は表示されませんが、文字列の描画に必要なピクセル数が増えるため、文字列全体が表示されます。
提供されたソリューションに同意します。私はそれを追加して、問題が何であるかをもう少し明らかにしたいと思います。ツリービューには、ルートレベルでアイテムの幅を決定する独自のフォントがあります。これは、アイテムの高さプロパティのみが使用可能であり、アイテムの幅プロパティが存在しないという事実を補います。
問題の解決策は、ルートノードのフォントを決定し、ツリーをその同じフォントに設定することです。設計時にも行うことができます。
それが誰かを助けることを願っています。
これはすべて私を助けていません。何DIDトリックは、デザイン時にフォントを少し大きく太字にすることです。(プロパティウィンドウで)
そのため、ツリービューを十分な大きさのフォントで定義してから、後で小さなフォントでノードを追加できます。彼らは収まります。
この問題の回避策は次のとおりです。
プロパティでツリービューのデフォルトのフォントを太字に設定します。
必要に応じて太字にしないように変更します。
以下を実行し、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を使用できますあなたはそれをする必要があると感じます。
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
これは古いスレッドであり、回答された可能性があります。 TreeViewsの使用方法を学んでいるときに、この問題に出くわしました。私のために働いたのは、TreeView全体のフォントサイズを同じサイズに変更するか、太字にするレベルのフォントより大きくすることでした。デフォルトのフォントサイズは8です。私は10に変更しました。これは、ノードに必要なサイズでしたが、切り捨てはなくなりました。
非常に簡単で問題なく動作します
treeView1.SelectedNode.NodeFont = new System.Drawing.Font(treeView1.SelectedNode.TreeView.Font, treeView1.SelectedNode.TreeView.Font.Style | FontStyle.Bold);
this.treeView1.SelectedNode.Text += string.Empty;
私のために働いたのは:コントロールのコンストラクターでロードイベントにフックし、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";
};
}
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 <--
}
それは私のために働く