当前位置: 首页 > 知识库问答 >
问题:

当treeview没有焦点时,C#WinForms会突出显示treenode

夏华藏
2023-03-14

我正在制作一个界面来编辑游戏场景。基本上,它由具有嵌套条件和操作的事件组成。所以,我计划使用两个树视图-一个用于选择事件,另一个用于选择事件内的条件/操作进行编辑。

现在,你看,如果我选择一个事件(在左树状视图中),然后尝试在右树状视图中选择某个内容,左树状视图将停止显示蓝色选择矩形。这显然很糟糕,因为现在用户不知道他正在编辑哪个事件!

我发现保留关于当前选择内容的某种信息的唯一方法是使用SseltedImageIndex,但这只是一个小图像,会有所不同。

在树形视图没有焦点的情况下,还有其他方法可以突出树形图吗?我知道我可以使用图形。Draw矩形什么的,但是我听说绘图应该在油漆事件中完成,树视图没有油漆事件...所以我猜如果我把它画在失去焦点的事件上,然后把表单拖出屏幕什么的,它会被“擦除”吗?

无论如何,请告诉我你是否有想法(除了为选定和未选定的treenode使用单独的图标)。

共有3个答案

蓟安歌
2023-03-14

快速解决方案:

设置属性:

  • HideSelection=false

然后在DrawNode事件处理程序中,只需执行以下操作:

private void treeView1_DrawNode(object sender, DrawTreeNodeEventArgs e) {
  e.DrawDefault = true;
}

在Windwos 7上,这将恢复旧的渲染,包括选择周围的虚线框(实际上看起来有点过时)。文本将是带焦点的白色,不带焦点的黑色。背景保持蓝色和可见。

这个答案并不新鲜,其他的也包含这些步骤,但这是最低限度的要求(至少在Windows7中,没有测试其他操作系统)。

邵兴怀
2023-03-14

它仍然显示,但只有浅灰色,这取决于您的屏幕和当前设置可以接近可见!

重写OnDrawNode事件。因此,您创建了一个继承自MicrosoftTreeView的类,并新建了一个类(称之为"SpecialTreeView")。然后添加以下事件覆盖:

protected override void OnDrawNode(DrawTreeNodeEventArgs e)
{
    TreeNodeStates treeState = e.State;
    Font treeFont = e.Node.NodeFont ?? e.Node.TreeView.Font;

    // Colors.
    Color foreColor = e.Node.ForeColor;
    string strDeselectedColor = @"#6B6E77", strSelectedColor = @"#94C7FC";
    Color selectedColor = System.Drawing.ColorTranslator.FromHtml(strSelectedColor);
    Color deselectedColor = System.Drawing.ColorTranslator.FromHtml(strDeselectedColor);

    // New brush.
    SolidBrush selectedTreeBrush = new SolidBrush(selectedColor);
    SolidBrush deselectedTreeBrush = new SolidBrush(deselectedColor);

    // Set default font color.
    if (foreColor == Color.Empty)
        foreColor = e.Node.TreeView.ForeColor;

    // Draw bounding box and fill.
    if (e.Node == e.Node.TreeView.SelectedNode)
    {
        // Use appropriate brush depending on if the tree has focus.
        if (this.Focused)
        {
            foreColor = SystemColors.HighlightText;
            e.Graphics.FillRectangle(selectedTreeBrush, 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
        {
            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);
        }
    }
}

编译代码,您应该在设计器中的工具箱中看到“特种树视图”。将您的TreeView替换为使用相同名称的新视图,唯一不同的是选择颜色。当选择它将是selectedColor,当不选择desseltedColor

我希望这能有所帮助。

吕鸿朗
2023-03-14

您要查找的是TreeView上的HideSelect属性。

来自MSDN:

获取或设置一个值,该值指示即使树视图失去焦点,选定的树节点是否仍保持高亮显示。

链接:http://msdn.microsoft.com/en-us/library/system.windows.forms.treeview.hideselection.aspx

代码:

TreeView.HideSelection = false;
 类似资料:
  • 我面临着这里提到的同样的问题SWT:表丢失了选择。我使用的是ubuntu 12.04,而不是windows。是否有任何方法可以突出显示SWT表的选定行,即使在焦点丢失之后。我尝试将focus listener添加到表中,在focus lost中,我更改了所选项目的背景色,而on focus gain重置了背景色。请参阅代码。 但它不起作用。是否有其他解决方案/解决方法?

  • 问题内容: 我有输入要显示格式化的数字。通常,当它没有焦点时,应该显示一个格式化的字符串,例如’$ 50,000.00’。但是当它具有焦点时,它应该显示原始值,例如用于编辑的50000。 有内置功能吗?谢谢! 问题答案: 这是一条指令(),它可以执行您想要的操作。 请注意,只有元素的显示值才被格式化(模型值将始终为未格式化)。 这个想法是您为和事件注册侦听器,并根据元素的焦点状态更新显示值。 另请

  • 本文向大家介绍C#自定义DataGridViewColumn显示TreeView,包括了C#自定义DataGridViewColumn显示TreeView的使用技巧和注意事项,需要的朋友参考一下 我们可以自定义DataGridView的DataGridViewColumn来实现自定义的列,下面介绍一下如何通过扩展DataGridViewColumn来实现一个TreeViewColumn 1.Tre

  • 本文向大家介绍HTML 突出显示,包括了HTML 突出显示的使用技巧和注意事项,需要的朋友参考一下 示例 该<mark>元素是HTML5中的新元素,用于“由于其在另一个上下文中的相关性”而标记或突出显示文档中的文本。1 最常见的示例是用户输入搜索查询并显示结果以突出显示所需查询的搜索结果。 输出: 常见的标准格式是黄色背景上的黑色文本,但是可以使用CSS进行更改。

  • 问题内容: 我已经看到chrome在边框上放置了一个较粗的边框,但是在我也使用border-radius的情况下,它看起来有点像。反正有删除它吗? 问题答案: 您应该可以使用删除它 但请记住,这可能对可用性不利:很难确定元素是否被聚焦,当您使用键浏览表单的所有元素时会很烂-您应该以某种方式反映元素的聚焦。

  • 我正在做Android智能电视应用: > 在中有一个自定义键盘和一个。 当应用程序启动时,焦点转到键盘。 null