C#樹形結構控制元件 Treeview
最近在做變電站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