代码之家  ›  专栏  ›  技术社区  ›  TheLogan

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

  •  0
  • TheLogan  · 技术社区  · 8 年前

    我构建了一个TreeView-through代码来匹配xml文档,并通过代码设置每个TreeView项目的标题来匹配标记名和一个重要属性(如果适用)。

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

    这看起来有点无聊,所以我想将标记名设置为一种颜色,属性值设置为另一种颜色,但我不知道这是否可行。

    有谁能告诉我,这可能吗?如果可能的话,我会怎么做?

    编辑

    我想澄清的是:

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

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

    编辑2

    根据大众的需求,这里是我用来创建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);
        }
    }
    

    编辑3

    这是名称生成的代码,我忘了在最新的编辑中添加它。 我已经从switch案例中删除了大部分代码,因为它只是更加相同而已。

    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 回复  |  直到 8 年前
        1
  •  2
  •   cuongtd    8 年前

    与直接将TreeViewItem标题分配给文本不同,您可以将其分配给内部有两个文本块的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(),
        };
    
        2
  •  0
  •   Sudsy1002    8 年前
                <TreeViewItem>
                    <TreeViewItem.Header>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="Asset - " Foreground="Blue"/>
                            <TextBlock Text="hands" Foreground="Yellow"/>
                        </StackPanel>
                    </TreeViewItem.Header>
                </TreeViewItem>
    

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

    编辑

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

    看起来你用的是 Utilities.GenerateName() 获取标题。您可以引入名称并将其添加到字符串中,而不是直接执行此操作

    ( String fullHeader = Utilities.GenerateName() ).

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

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

    逻辑可以是您想要分割字符串的方式,并且根据您获取名称的方式,您甚至可以在 公用事业GenerateName() 方法

    你需要完成的最重要的部分是 StackPanel .

    例如,您可以这样做:

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