最近在做变电站SCD配置文件解析软件,将SCD文件中的信息提取出来,可视化二次设备的连接信息。其中需要实现的一个功能是将该变电站中的所有设备以树形结构展示在左边的导航栏。大概效果如下图所示:
首先我们将窗体布局分为两列,第一列即为我们treeview控件的区域。
1 <Grid Name="grid1"> 2 <Grid.ColumnDefinitions> 3 <ColumnDefinition Width= "250" /> 4 <ColumnDefinition Width="*" /> 5 </Grid.ColumnDefinitions> 6 7 </Grid>
1.
在我们已经确定要展示的节点有多少时,可以直接在xaml中创建treeview控件,treeview的属性Grid.Row和Grid.Column决定控件在布局中的位置 。TreeView下创建TreeViewItem,每个TreeViewItem就是树形结构中的一个节点或者子节。
1 <TreeView Grid.Row="0" Grid.Column="0" ScrollViewer.VerticalScrollBarVisibility="Visible" Margin="0,0,0,0"> 2 <TreeViewItem Header="常用属性" > 3 <TreeViewItem Header="MarginPadding" /> 4 <TreeViewItem Header="HorizontalAlignmentPage" /> 5 <TreeViewItem Header="VerticalAlignmentPage" /> 6 </TreeViewItem> 7 <TreeViewItem Header="常用控件布局" > 8 <TreeViewItem Header="GridPage" /> 9 <TreeViewItem Header="StackPanelPage" /> 10 <TreeViewItem Header="CanvasPage" /> 11 </TreeViewItem> 12 <TreeViewItem Header="常用基本控件"> 13 <TreeViewItem Header="ButtonPage" /> 14 <TreeViewItem Header="TextBoxPasswordBox" /> 15 </TreeViewItem> 16 <TreeViewItem Header="菜单工具条状态条"> 17 <TreeViewItem Header="MenuContextMenu" /> 18 <TreeViewItem Header="ToolBarStatusBar" /> 19 </TreeViewItem> 20 </TreeView>
上述代码的运行效果如下图,“常用属性”、“常用控件布局”、“常用基本控件”、“菜单工具状态条”四个节点下有各自的子节点。
2.
但我面临的问题是,我需要展示的节点数目是未知的,我提取到的设备有多少个,我就需要多少个节点,这样我就没法在xaml中直接创建treeview控件。需要在后台创建。
首先,和前面一样还是在xaml中将窗体布局划分好。
下面是用C#创建treeview控件的过程。在MainLoaded中,调用我自己创建的一个函数iedNameProgram,这个函数会返回一个list,其中的元素是所有的设备名。
1 public partial class MainWindow : Window 2 { 3 public MainWindow() 4 { 5 InitializeComponent(); 6 Loaded += MainLoaded; 7 } 8 9 private void MainLoaded(object sender, RoutedEventArgs e) 10 { 11 IedNameProgram iedNameProgram = new IedNameProgram(); 12 List<string> ied_list = iedNameProgram.Program(); // 自己的函数 返回一个list 元素是所有设备的设备名 13 14 int num = ied_list.Count; // 获取list的元素个数 15 TreeView treeView = new TreeView(); // 创建TreeView实例 16 for (int i = 1; i <= num; i++) // 循环 为每一个设备名创建一个节点 17 { 18 TreeViewItem treeViewItem1 = new TreeViewItem() { Visibility = Visibility.Visible, Header = ied_list[i - 1] }; // 创建TreeViewItem实例,并设置其相关属性 19 treeView.Items.Add(treeViewItem1); 20 21 } 22 this.grid1.Children.Add(treeView); 23 }
}
用C#创建树形结构的思路是先实例化所有的控件(代码18),再根据节点之间的包含关系,将子节点添加到父节点中。
最后将最外层的TreeViewItem添加到TreeView中(代码19),将TreeView添加到Grid中(代码22)。
很像搬家打包行李的过程,想把所有的目标物品都收拾出来,再将它们分门别类装入小箱子,再把小箱子装入大箱子,把大箱子装车。
2020-11-22