WinUI3 TreeView填充异常:节点能否使用非字符串内容?
WinUI3 TreeViewNode 支持非字符串内容吗?
用户尝试用以下C++/WinRT代码填充WinUI3的TreeView,却得到异常显示效果:
auto root = tv.RootNodes(); for (auto& group : e) { TreeViewNode tvn1; tvn1.Content(box_value(group.name)); root.Append(tvn1); for (auto& subgroup : group) { auto name = sub.name; StackPanel sp; sp.Orientation(winrt::Microsoft::UI::Xaml::Controls::Orientation::Vertical); TextBlock tb1; tb1.Text(name); sp.Children().Append(tb1); TreeViewNode tvn2; tvn2.Content(sp); tvn1.Children().Append(tvn2); } }
用户疑问:TreeViewNode是否仅接受box_value("string")这类字符串作为Content,而不支持StackPanel等元素?能否实现节点为非纯字符串的TreeView?
解答
TreeViewNode完全支持非字符串类型的Content,包括StackPanel这类UI元素,你的代码问题出在没有为TreeView指定自定义的ItemTemplate。
默认情况下,TreeView会把Content当成字符串处理,直接调用ToString()方法显示内容,所以传入StackPanel时,它只会显示该对象的类型名称,导致异常效果。
要实现自定义节点布局,只需完成两步:
在XAML中为TreeView设置ItemTemplate
定义DataTemplate来指定节点的显示布局。如果你的Content是UI元素本身,最简单的方式是用ContentPresenter直接渲染Content:<TreeView x:Name="tv"> <TreeView.ItemTemplate> <DataTemplate> <ContentPresenter Content="{Binding}" /> </DataTemplate> </TreeView.ItemTemplate> </TreeView>修正C++/WinRT代码的细节问题
- UI元素本身是引用类型,直接赋值给TreeViewNode的Content即可,无需
box_value - 原代码里的
auto name = sub.name;是笔误,应该改为subgroup.name
- UI元素本身是引用类型,直接赋值给TreeViewNode的Content即可,无需
修正后的子节点代码示例:
for (auto& subgroup : group) { auto name = subgroup.name; StackPanel sp; sp.Orientation(winrt::Microsoft::UI::Xaml::Controls::Orientation::Vertical); TextBlock tb1; tb1.Text(name); sp.Children().Append(tb1); TreeViewNode tvn2; tvn2.Content(sp); tvn1.Children().Append(tvn2); }
总结:TreeView支持任意类型的Content,只要通过ItemTemplate指定对应的显示方式,就能实现自定义布局的节点。
内容的提问来源于stack exchange,提问作者Michael Chourdakis
相关产品推荐
相关产品推荐

