Treeview没有焦点时,C#WinForms高亮treenodeGretings。我正在创建一个界面来编辑游戏场景。它基本上由具有嵌套条件和操作的事件组成。因此,我计划使用两个树视图-一个用于选择事件,另一个用于选择要编辑的事件中的条件/操作。现在,你看,如果我选择一个事件(在左侧树视图中),然后尝试在右侧树视图中选择某些内容,左侧树视图将停止显示蓝色选择矩形。这显然很糟糕,因为现在用户不知道他正在编辑哪个事件!我发现保留有关当前选择的一些信息的唯一方法是使用SelectedImageIndex,但这只是一个不同的小图像。有没有其他方法可以在不关注树视图的情况下突出显示树节点?我知道我可以只使用Graphics.DrawRectangle或其他东西,但我听说绘图应该在Paint事件中完成,而treeview没有绘图事件......所以我想如果我在失去焦点时绘制它,并且然后拖动表单屏幕除了它会被“删除”以外的东西?无论如何,如果您有任何想法请告诉我(除了为选定和未选定的树节点使用单独的图标)谢谢!您正在寻找的是TreeView上的HideSelection属性。来自MSDN:获取或设置一个值,该值指示即使树视图失去焦点,所选树节点是否保持突出显示。链接:http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.hideselection.aspx代码:TreeView.HideSelection=false;它仍然显示,但只是浅灰色,由您决定在附近可以看到屏幕和当前设置!覆盖OnDrawNode事件。因此,您创建了继承自MicrosoftTreeView的新类(称为“SpecialTreeView”),例如类SpecialTreeView:TreeView。然后添加以下事件外壳:protectedoverridevoidOnDrawNode(DrawTreeNodeEventArgse){TreeNodeStatestreeState=e.State;字体treeFont=e.Node.NodeFont??e.Node.TreeView.Font;//颜色。颜色foreColor=e.Node.ForeColor;字符串strDeselectedColor=@"#6B6E77",strSelectedColor=@"#94C7FC";颜色selectedColor=System.Drawing.ColorTranslator.FromHtml(strSelectedColor);ColordeselectedColor=System.Drawing.ColorTranslator.FromHtml(strDeselectedColor);//新画笔。SolidBrushselectedTreeBrush=newSolidBrush(selectedColor);SolidBrushdeselectedTreeBrush=newSolidBrush(deselectedColor);//设置默认字体颜色。如果(foreColor==Color.Empty)foreColor=e.Node.TreeView.ForeColor;//绘制边界框并填充。if(e.Node==e.Node.TreeView.SelectedNode){//根据树是否有焦点使用适当的画笔。如果(this.Focused){foreColor=SystemColors.HighlightText;e.Graphics.FillRectangle(selectedTreeBrush,e.Bounds);控制画图.DrawFocusRectangle(e.Graphics,e.Bounds,foreColor,SystemColors.Highlight);TextRenderer.DrawText(e.Graphics,e.Node.Text,treeFont,e.Bounds,foreColor,TextFormatFlags.GlyphOverhangPadding);}else{foreColor=SystemColors.HighlightText;e.Graphics.FillRectangle(deselectedTreeBrush,e.Bounds);ControlPaint.DrawFocusRectangle(e.Graphics,e.Bounds,foreColor,SystemColors.Highlight);TextRenderer.DrawText(e.Graphics,e.Node.Text,treeFont,e.Bounds,foreColor,TextFormatFlags.GlyphOverhangPadding);}}else{if((e.State&TreeNodeStates.Hot)==TreeNodeStates.Hot){e.Graphics.FillRectangle(SystemBrushes.Window,e.Bounds);TextRenderer.DrawText(e.Graphics、e.Node.Text、hotFont、e.Bounds、System.Drawing.Color.Black、TextFormatFlags.GlyphOverhangPadding);}else{e.Graphics.FillRectangle(SystemBrushes.Window,e.Bounds);TextRenderer.DrawText(e.Graphics,e.Node.Text,treeFont,e.Bounds,foreColor,TextFormatFlags.GlyphOverhangPadding);}}}编译代码,您应该在设计器的工具箱中看到“SpecialTreeView”用同名的新TreeView替换TreeView,唯一的区别是选择颜色。选中时会选择颜色,未选中时取消选择颜色。我希望这有帮助。快速解决方案设置属性:然后在DrawNode事件处理程序中只需执行以下操作:privatevoidtreeView1_DrawNode(objectsender,DrawTreeNodeEventArgse){e.DrawDefault=true;在Windwos7上,这将恢复旧的渲染,包括围绕选择虚线框(实际上看起来有点过时)。文本将在有焦点时为白色,在没有焦点时为黑色。背景保持蓝色且可见。这个答案并不新鲜,其他答案包含这些步骤,但这是最低要求(至少在Windows7中,没有测试其他操作系统)。不是绝对完美的解决方案,但是非常接近:以上是C#学习教程:当treeview没有焦点时,C#WinForms高亮显示treenode分享的全部内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——treeView.HideSelection=false;treeView.DrawMode=TreeViewDrawMode.OwnerDrawText;treeView.DrawNode+=(o,e)=>{if(!e.Node.TreeView.Focused&&e.Node==e.Node.TreeView.SelectedNode){字体treeFont=e.Node.NodeFont??e.Node.TreeView.Font;e.Graphics.FillRectangle(Brushes.Gray,e.Bounds);ControlPaint.DrawFocusRectangle(e.Graphics,e.Bounds,SystemColors.HighlightText,SystemColors.Highlight);TextRenderer.DrawText(e.Graphics,e.Node.Text,treeFont,e.Bounds,SystemColors.HighlightText,TextFormatFlags.GlyphOverhangPadding);}否则e.DrawDefault=true;};treeView.MouseDown+=(o,e)=>{TreeNode节点=treeView.GetNodeAt(eX,eY);if(node!=null&&node.Bounds.Contains(eX,eY))treeView.SelectedNode=node;};本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
