【发布时间】:2010-03-09 21:38:51
【问题描述】:
我正在尝试向标准 System.Windows.Forms.TreeView 控件的元素添加更多图标。
我的计划是只更改树视图控件的标签区域,但它显示出一种奇怪的行为。如果我单击一个节点来选择它,当按下鼠标按钮时,背景会以高亮颜色正确绘制。但是,在我释放鼠标按钮之前,文本是错误的未选择颜色。就好像e.State 在按下和释放鼠标按钮之间包含错误的状态。
这就是我正在做的事情:我使用this.DrawMode = TreeViewDrawMode.OwnerDrawText 进行初始化,然后使用this.DrawNode += LayoutTreeView_DrawNode 注册我的事件处理程序。这是处理程序:
void LayoutTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
Color color = (e.State & TreeNodeStates.Selected) != 0 ?
SystemColors.HighlightText : SystemColors.WindowText;
TextFormatFlags flags = TextFormatFlags.Left | TextFormatFlags.SingleLine |
TextFormatFlags.VerticalCenter | TextFormatFlags.EndEllipsis;
TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, color, flags);
}
如果我将处理程序设置为默认情况...
void LayoutTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
{
e.DefaultDraw = true;
}
...同样的事情发生了,这很奇怪,因为 windows 现在实际上正在绘制它。此行为在带有 .Net 3.5 的 Windows XP 中。
有什么办法可以解决这种奇怪的行为吗?
【问题讨论】:
-
仅供参考,包含您正在处理的 .Net 版本总是很有用的。我会试一试你的样本,看看我是否完全理解你所看到的。如果我想我会告诉你我的想法。
-
另外,我从不喜欢在控件的使用者中进行绘图。我总是推动在派生类中完成它,这样如果在另一个表单或应用程序上需要相同的行为,它会更容易做到。
-
我无法使用默认绘制重现所描述的行为,但可以使用自定义代码。我正在运行 Vista x64; VS 2008。.Net 3.5。您能否将您正在使用的操作系统、Visual Studio 和 .Net 版本添加到问题中。 (我听说 Vista 和 Windows 7 在 TreeViews 在操作系统中的工作方式方面与 XP 存在一些差异。)
-
嗯,实际上它是一个使用自己的事件的派生控件。该行为在带有 .Net 3.5 的 Windows XP 中
标签: c# .net winforms treeview ownerdrawn