我通过代码构建一个TreeView来匹配一个xml文档,我通过代码设置每个TreeViewItem的头,以匹配标记名称和(如果适用)重要属性。
虽然看起来有点无聊所以我想将标签名称设置为一种颜色,将属性值设置为不同的颜色,但我无法弄清楚这是否可能。
任何人都可以启发我,这是否可能,如果是这样,我该如何解决呢?
修改
只是为了澄清我想做的事情:
[蓝色]名称 - [/蓝色] [黄色]属性[/黄色]
所以第一个资产,“资产 - ”是蓝色,“手”是黄色。
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 : "";
}
}
答案 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
}