[英]WPF TreeviewItem header text is set to object type when using stackpanel
[英]Set multi colour treeviewitem header programmatically
我通过代码构建一个TreeView以匹配xml文档,并且通过代码设置每个TreeViewItem的标题以匹配标记名称和(如果适用)重要属性。
虽然看起来有点无聊,所以我想将标签名设置为一种颜色,将属性值设置为另一种颜色,但是我什至无法确定是否可行。
谁能启发我,这有可能吗?如果可以,我将如何解决?
编辑
只是为了澄清我想做的是:
[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.