繁体   English   中英

以编程方式设置多色treeviewitem标头

[英]Set multi colour treeviewitem header programmatically

我通过代码构建一个TreeView以匹配xml文档,并且通过代码设置每个TreeViewItem的标题以匹配标记名称和(如果适用)重要属性。

https://image.prntscr.com/image/Ns6ilv7lRCa1LVHdP5OIwQ.png

虽然看起来有点无聊,所以我想将标签名设置为一种颜色,将属性值设置为另一种颜色,但是我什至无法确定是否可行。

谁能启发我,这有可能吗?如果可以,我将如何解决?

编辑

只是为了澄清我想做的是:

[blue]名称-[/ blue] [yellow]属性[/ yellow]

因此,第一个资产的“资产-”为蓝色,“手”为黄色。

EDIT2

出于普遍的需求,这是我用来创建TreeView的代码:)

private TreeView CreateTree() {
    xmlDocument = XDocument.Load(FullPath, LoadOptions.SetLineInfo);
    xmlDocument.DescendantNodes().OfType < XComment > ().Remove();

    var tree = new TreeView {
        Name = "treeview_1",
        Background = (SolidColorBrush) new BrushConverter().ConvertFrom("#1e1e1e")
    };


    var firstNode = xmlDocument.Descendants().First();
    var treeItm = new TreeViewItem {
        Header = Utilities.GenerateName(firstNode),
        Tag = firstNode.AbsoluteXPath(),
        Foreground = Brushes.WhiteSmoke
    };

    treeItm.Selected += NodeSelected;
    tree.Items.Add(treeItm);
    AddNodes(xmlDocument.Descendants().First(), treeItm);
    return tree;
}

private void AddNodes(XElement lastNode, TreeViewItem lastTreeItm) {
    var xElements = lastNode.Descendants().ToList();
    if (xElements.Any()) {
        var treeItm = new TreeViewItem {
            Header = Utilities.GenerateName(xElements.First()),
            Tag = xElements.First().AbsoluteXPath(),
            Foreground = Brushes.WhiteSmoke
        };
        treeItm.Selected += NodeSelected;
        lastTreeItm.Items.Add(treeItm);
        AddNodes(xElements.First(), treeItm);
    }


    var sibl = (XElement) lastNode.NextNode;
    if (sibl != null) {
        var treeItm = new TreeViewItem {
            Header = Utilities.GenerateName(sibl),
            Tag = sibl.AbsoluteXPath(),
            Foreground = Brushes.WhiteSmoke
        };
        treeItm.Selected += NodeSelected;
        ((TreeViewItem) lastTreeItm.Parent).Items.Add(treeItm);
        AddNodes(sibl, treeItm);
    }
}

EDIT3

这是用于生成名称的代码,我忘了在最新编辑中添加它。 我已经从开关盒中删除了大部分代码,因为它们几乎相同。

public class Utilities
{
    public static string GenerateName(XElement node)
    {
        switch (node.Name.LocalName)
        {
            case "Time":
                return "Time - " + GetAttr(node, "Id");
            default:
                if(node.Attribute("Id")?.Value != null)
                    return node.Name.LocalName + " - " + node.Attribute("Id")?.Value;
                return node.Name.LocalName;
        }   
    }

    private static string GetAttr(XElement node, string id)
    {
        return node.Attribute(id) != null ? node.Attribute(id)?.Value : "";
    }
}

您可以将内部有两个TextBlocks分配给StackPanel,而不是直接将TreeViewItem标头分配给文本

        StackPanel stackPanel = new StackPanel();
        stackPanel.Children.Add(new TextBlock { Text = Utilities.GenerateName(...), Foreground = Brushes.Red });
        stackPanel.Children.Add(new TextBlock { Text = Utilities.GetAttr(...), Foreground = Brushes.Yellow });
        stackPanel.Orientation = Orientation.Horizontal;

        var treeItm = new TreeViewItem {
        Header = stackPanel,
        Tag = firstNode.AbsoluteXPath(),
    };
            <TreeViewItem>
                <TreeViewItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Asset - " Foreground="Blue"/>
                        <TextBlock Text="hands" Foreground="Yellow"/>
                    </StackPanel>
                </TreeViewItem.Header>
            </TreeViewItem>

这应该是您想要的。 通过使用StackPanel,您可以设置两个具有不同前景色的TextBlock。

编辑

由于您是在C#中执行此操作,因此您主要只需要更改获取每个TreeViewItems的Header属性的方式。

好像您使用Utilities.GenerateName()来获取Headers。 您可以直接输入名称并将其添加到字符串中,而不是直接执行此操作

String fullHeader = Utilities.GenerateName() )。

然后使用一些逻辑来确定如何分割字符串。 假设您有2个值(IE String.Split()返回了大小为2的字符串数组),则只需使TextBlocks具有所需的Foreground属性并将文本属性设置为新的Strings。

TextBlock1.Text = YourStringArray[0]TextBlock2.Text = YourStringArray[1]

但是,逻辑可以是您想分割字符串,并根据获取名称的方式,甚至可以在Utilities.GenerateName()方法中设置逻辑。

完成所需功能的最大部分是StackPanel

例如,您可以执行以下操作:

StackPanel myStackPanel = new StackPanel();
myStackPanel.Orientation = Orientation.Horizontal;
var treeItm = new TreeViewItem
{
    Header = myStackPanel,
    Tag = xElements.First().AbsoluteXPath(),
    Foreground = Brushes.WhiteSmoke
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM