UWP XAML TreeView创建方法及内容无法打印问题咨询
UWP XAML中TreeView控件的创建与内容打印解决方案
一、TreeView控件的创建方式
1. 静态声明(适合固定静态数据)
像你提供的代码一样,直接在XAML中手动定义节点层级:
<TreeView x:Name="treeview" Grid.Row="2" Background="Blue" HorizontalAlignment="Center"> <TreeView.RootNodes> <TreeViewNode Content="color"> <TreeViewNode.Children> <TreeViewNode Content="blue"/> <TreeViewNode Content="green"/> <TreeViewNode Content="red"/> </TreeViewNode.Children> </TreeViewNode> </TreeView.RootNodes> </TreeView>
2. 动态数据绑定(适合动态生成的层级数据)
如果数据是动态变化的,推荐使用数据绑定结合HierarchicalDataTemplate:
- 第一步:定义数据模型
public class TreeNodeModel { public string Name { get; set; } public ObservableCollection<TreeNodeModel> Children { get; set; } = new ObservableCollection<TreeNodeModel>(); }
- 第二步:XAML中配置绑定
<TreeView x:Name="dynamicTreeView" ItemsSource="{Binding RootNodes}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}"/> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView>
- 第三步:后台赋值数据
var rootNode = new TreeNodeModel { Name = "color" }; rootNode.Children.Add(new TreeNodeModel { Name = "blue" }); rootNode.Children.Add(new TreeNodeModel { Name = "green" }); rootNode.Children.Add(new TreeNodeModel { Name = "red" }); dynamicTreeView.DataContext = new { RootNodes = new List<TreeNodeModel> { rootNode } };
二、解决TreeView内容无法打印的问题
UWP直接打印TreeView控件可能因布局虚拟化或层级结构问题导致内容不完整,可通过以下步骤实现完整打印:
1. 递归遍历所有节点,收集文本内容
private List<string> GetAllTreeNodesText(TreeViewNode node, int indentLevel = 0) { var nodeTexts = new List<string>(); // 用缩进体现节点层级 nodeTexts.Add(new string(' ', indentLevel * 2) + node.Content.ToString()); // 递归处理子节点 foreach (var childNode in node.Children) { nodeTexts.AddRange(GetAllTreeNodesText(childNode, indentLevel + 1)); } return nodeTexts; }
2. 生成可打印文档并触发打印
private async void PrintTreeViewContent() { var printDocument = new PrintDocument(); printDocument.PrintPage += (sender, args) => { // 创建文本块承载所有节点内容 var contentTextBlock = new TextBlock { Text = string.Join(Environment.NewLine, GetAllTreeNodesText(treeview.RootNodes[0])), FontSize = 12, Width = args.PrintableArea.Width, TextWrapping = TextWrapping.Wrap }; args.PageVisual = contentTextBlock; }; // 唤起系统打印对话框 await PrintManager.ShowPrintUIAsync(); }
3. 触发打印操作
添加打印按钮并绑定事件:
<Button Content="打印TreeView内容" Click="PrintButton_Click"/>
private void PrintButton_Click(object sender, RoutedEventArgs e) { PrintTreeViewContent(); }
注意:如果你的TreeView节点使用了自定义模板(非纯文本Content),需要修改GetAllTreeNodesText方法,从模板元素中提取实际显示的内容。
内容的提问来源于stack exchange,提问作者ailsa
相关产品推荐
相关产品推荐

