最近在做變電站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