【发布时间】:2009-08-18 13:50:57
【问题描述】:
我有一个分为 3 个级别的树形视图。 我在每个组级别中添加了它拥有的孩子的数量。 现在我想将该数字设置为不同的颜色或粗体。
例子:
树[3]
|_ firstGroup [2]
|_ 第一个孩子
|_ 次子
|_ secondGroup [1]
|_ 第三个孩子
这是一个 Windows 窗体应用程序。 我认为这是不可能的,但我想确定一下。
【问题讨论】:
我有一个分为 3 个级别的树形视图。 我在每个组级别中添加了它拥有的孩子的数量。 现在我想将该数字设置为不同的颜色或粗体。
例子:
树[3]
|_ firstGroup [2]
|_ 第一个孩子
|_ 次子
|_ secondGroup [1]
|_ 第三个孩子
这是一个 Windows 窗体应用程序。 我认为这是不可能的,但我想确定一下。
【问题讨论】:
我认为您可以通过将 TreeView 控件的 DrawMode 设置为 OwnerDrawText 来做到这一点,并在 DrawNode 事件处理程序中执行绘图。
DrawNode 实现示例(在空格处分割节点字符串,以粗体绘制第一个元素,字符串的其余部分使用常规字体,如果没有空格,我们让操作系统代替绘制):
private void TreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
string regex = @"^.*\s+\[\d+\]$";
if (Regex.IsMatch(e.Node.Text, regex, RegexOptions.Compiled))
{
string[] parts = e.Node.Text.Split(' ');
if (parts.Length > 1)
{
string count = parts[parts.Length - 1];
string text = " " + string.Join(" ", parts, 0, parts.Length - 1);
Font normalFont = e.Node.TreeView.Font;
float textWidth = e.Graphics.MeasureString(text, normalFont).Width;
e.Graphics.DrawString(text,
normalFont,
SystemBrushes.WindowText,
e.Bounds);
using (Font boldFont = new Font(normalFont, FontStyle.Bold))
{
e.Graphics.DrawString(count,
boldFont,
SystemBrushes.WindowText,
e.Bounds.Left + textWidth,
e.Bounds.Top);
}
}
}
else
{
e.DrawDefault = true;
}
}
注意:您可能希望将变量或属性添加到保存粗体字体的表单,而不是为每个绘制的 TreeNode 重新创建和处理它。
【讨论】:
如果您确实需要此功能,则可以扩展 TreeView 控件。据我所知,它没有密封。
【讨论】: