在WPF treeview中获取完整路径?
问题描述:
如果我编程方式创建一个WPF树视图,例如:在WPF treeview中获取完整路径?
// TreeView treeView; <- added in the designer
TreeViewItem rootNode = new TreeViewItem();
rootNode.Header = "RootNode"
treeView.Items.Add(rootNode);
TreeViewItem subNode1 = new TreeViewItem();
subNode1.Header = "SubNode1";
rootNode.Items.Add(subNode1);
TreeViewItem subNode2 = new TreeViewItem();
subNode2.Header = "SubNode2";
rootNode.Items.Add(subNode2);
不过,我想获得的路径到达某个节点在TreeView很像在System.Windows.Forms.TreeNode
类的FullPath
属性。所以subNode2
的路径是RootNode//SubNode2
。我该怎么做呢?
编辑:我不是在寻找手动解决方案,但我想知道是否有像FullPath
等效的访问器,或者如果我要以错误的方式使用WPF TreeView类。例如。我看过DisplayMemberPath
和SelectedValuePath
,但他们似乎没有提供我以后的结果。
答
看看这里我的答案:
Silverlight: Determine parent TreeViewItem?
确定路径则很简单:
public string GetFullPath(TreeViewItem node)
{
if (node == null)
throw new ArgumentNullException();
var result = Convert.ToString(node.Header);
for (var i = GetParentItem(node); i != null; i = GetParentItem(i))
result = i.Header + "\\" + result;
return result;
}
答
请参见下面的代码。
所以这个函数返回一个堆栈,其中最顶端的项目将是根,最后一个项目将是元素的直接父项。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
TreeViewItem rootNode = new TreeViewItem();
rootNode.Header = "RootNode";
treeView.Items.Add(rootNode);
TreeViewItem subNode1 = new TreeViewItem();
subNode1.Header = "SubNode1";
rootNode.Items.Add(subNode1);
TreeViewItem subNode2 = new TreeViewItem();
subNode2.Header = "SubNode2";
rootNode.Items.Add(subNode2);
TreeViewItem subNode3 = new TreeViewItem();
subNode3.Header = "SubNode3";
subNode2.Items.Add(subNode3);
}
public static Stack<TreeViewItem> GetNodeParent(UIElement element)
{
Stack<TreeViewItem> tempNodePath = new Stack<TreeViewItem>();
// Walk up the element tree to the nearest tree view item.
TreeViewItem container = element as TreeViewItem;
while ((element != null))
{
element = VisualTreeHelper.GetParent(element) as UIElement;
container = element as TreeViewItem;
if(container!=null)
tempNodePath.Push(container);
}
return tempNodePath;
}
private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
Stack<TreeViewItem> path = GetNodeParent(e.NewValue as UIElement);
}
}