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

时间:2018-01-25 11:55:29

标签: c# wpf treeview

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

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

虽然看起来有点无聊所以我想将标签名称设置为一种颜色,将属性值设置为不同的颜色,但我无法弄清楚这是否可能。

任何人都可以启发我,这是否可能,如果是这样,我该如何解决呢?

修改

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

[蓝色]名称 - [/蓝色] [黄色]属性[/黄色]

所以第一个资产,“资产 - ”是蓝色,“手”是黄色。

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 : "";
    }
}

2 个答案:

答案 0 :(得分:1)

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

        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(),
    };

答案 1 :(得分:0)

            <TreeViewItem>
                <TreeViewItem.Header>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Asset - " Foreground="Blue"/>
                        <TextBlock Text="hands" Foreground="Yellow"/>
                    </StackPanel>
                </TreeViewItem.Header>
            </TreeViewItem>

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

修改

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

看起来您使用Utilities.GenerateName()来获取标头。您可以将名称带入并将其添加到字符串

,而不是直接执行此操作

String fullHeader = Utilities.GenerateName())。

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

I.e 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
}