WPF 帶CheckBox、圖標的TreeView

WPF 帶CheckBox、圖標的TreeView

在WPF實際項目開發的時候,經常會用到帶CheckBox的TreeView,雖然微軟在WPF的TreeView中沒有提供該功能,但是微軟在WPF中提供強大的ItemTemplate模板功能和自定義樣式,那我們可以自己寫一個這樣的控件供自己使用。

?我自己寫的這個比較簡單。

首先寫一個供TreeView使用的數據模型,并且實現INotifyPropertyChanged接口,用于向客戶端(通常是執行綁定的客戶端)發出某一屬性值已更改的通知,當屬性改變時,相應的UI表現也改變。主要字段Id,Name,Icon,ToolTip,IsChecked,IsExpanded,Parent,Children

復制代碼
//***************************************************
//
// 文件名(FileName)  : TreeModel.cs
//
// 作者(Author)      : zsm
//
// 創建時間(CreateAt):  2013-03-18 14:23:58
//
// 描述(Description) : 供TreeView實用的數據模型
//
//***************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;namespace Com.FMS.Model
{public class TreeModel : INotifyPropertyChanged{#region 私有變量/// <summary>/// Id值/// </summary>private string _id;/// <summary>/// 顯示的名稱/// </summary>private string _name;/// <summary>/// 圖標路徑/// </summary>private string _icon;/// <summary>/// 選中狀態/// </summary>private bool _isChecked;/// <summary>/// 折疊狀態/// </summary>private bool _isExpanded;/// <summary>/// 子項/// </summary>private IList<TreeModel> _children;/// <summary>/// 父項/// </summary>private TreeModel _parent;#endregion /// <summary>/// 構造/// </summary>public TreeModel(){Children = new List<TreeModel>();_isChecked = false;IsExpanded = false;_icon = "/Images/16_16/folder_go.png";}/// <summary>/// 鍵值/// </summary>public string Id{get { return _id; }set { _id = value; }}/// <summary>/// 顯示的字符/// </summary>public string Name{get { return _name; }set { _name = value; }}/// <summary>/// 圖標/// </summary>public string Icon{get { return _icon; }set { _icon = value; }}/// <summary>/// 指針懸停時的顯示說明/// </summary>public string ToolTip {get {return String.Format("{0}-{1}", Id, Name);}}/// <summary>/// 是否選中/// </summary>public bool IsChecked{get{return _isChecked;}set{if (value != _isChecked){_isChecked = value;NotifyPropertyChanged("IsChecked");if (_isChecked){//如果選中則父項也應該選中if (Parent != null){Parent.IsChecked = true;}}else{//如果取消選中子項也應該取消選中foreach (TreeModel child in Children){child.IsChecked = false;}}}}}/// <summary>/// 是否展開/// </summary>public bool IsExpanded{get { return _isExpanded; }set{if (value != _isExpanded){//折疊狀態改變_isExpanded = value;NotifyPropertyChanged("IsExpanded");}}}/// <summary>/// 父項/// </summary>public TreeModel Parent{get { return _parent; }set { _parent = value; }}/// <summary>/// 子項/// </summary>public IList<TreeModel> Children{get { return _children; }set { _children = value; }}/// <summary>/// 設置所有子項的選中狀態/// </summary>/// <param name="isChecked"></param>public void SetChildrenChecked(bool isChecked){foreach (TreeModel child in Children){child.IsChecked = IsChecked;child.SetChildrenChecked(IsChecked);}}/// <summary>/// 設置所有子項展開狀態/// </summary>/// <param name="isExpanded"></param>public void SetChildrenExpanded(bool isExpanded) {foreach (TreeModel child in Children){child.IsExpanded = isExpanded;child.SetChildrenExpanded(isExpanded);}}/// <summary>/// 屬性改變事件/// </summary>public event PropertyChangedEventHandler PropertyChanged;private void NotifyPropertyChanged(String info){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(info));}}}
}
復制代碼

創建一個用戶控件,主要含有一個TreeView控件,ContextMenu右鍵菜單項,UI代碼如下(其中的路徑請根據實際修改):

復制代碼
<UserControl x:Class="Com.FMS.View.UserControls.ZsmTreeView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Com.FMS.Model"mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300"><Grid><DockPanel><Border DockPanel.Dock="Bottom"><StackPanel Orientation="Horizontal" ToolTip="右鍵有更多功能哦!"><Image Height="16" Width="16" Source="Images/16_16/emoticon_smile.png"></Image><Label Content="右鍵有更多功能哦!" Foreground="Gray"></Label></StackPanel></Border><Border><TreeView Name="tvZsmTree"><TreeView.ContextMenu><ContextMenu><MenuItem Name="menuExpandAll" Header="全部展開" Click="menuExpandAll_Click"><MenuItem.Icon><Image Source="/Com.FMS;component/Images/16_16/folder_open_arrow.png" /></MenuItem.Icon></MenuItem><MenuItem Name="menuUnExpandAll" Header="全部折疊" Click="menuUnExpandAll_Click"><MenuItem.Icon><Image Source="/Com.FMS;component/Images/16_16/folder_close_arrow.png" /></MenuItem.Icon></MenuItem><MenuItem Name="menuSelectAll" Header="全部選中" Click="menuSelectAll_Click"><MenuItem.Icon><Image Source="/Com.FMS;component/Images/16_16/tick.png" /></MenuItem.Icon></MenuItem><MenuItem Name="menuUnSelectAll" Header="全部取消" Click="menuUnSelectAll_Click"><MenuItem.Icon><Image Source="/Com.FMS;component/Images/16_16/delete.png" /></MenuItem.Icon></MenuItem></ContextMenu></TreeView.ContextMenu><TreeView.ItemContainerStyle><Style TargetType="TreeViewItem"><Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"></Setter><EventSetter Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/></Style></TreeView.ItemContainerStyle><TreeView.ItemTemplate><HierarchicalDataTemplate DataType="{x:Type local:TreeModel}"  ItemsSource="{Binding Children}"><StackPanel  Margin="-2,0,0,0" Orientation="Horizontal" x:Name="staTree"><CheckBox ToolTip="{Binding ToolTip}" FontSize="14" FontFamily="微軟雅黑" Tag="{Binding Children}" IsChecked="{Binding IsChecked, Mode=TwoWay}"><StackPanel Orientation="Horizontal"><Image VerticalAlignment="Center" Source="{Binding Icon}" ></Image><TextBlock Text="{Binding Name}"></TextBlock></StackPanel><CheckBox.ContextMenu><ContextMenu><MenuItem Name="menuSelectAllChild" Header="全部選中子項" Click="menuSelectAllChild_Click"><MenuItem.Icon><Image Source="/Com.FMS;component/Images/16_16/tick.png" /></MenuItem.Icon></MenuItem></ContextMenu></CheckBox.ContextMenu></CheckBox></StackPanel><HierarchicalDataTemplate.Triggers><DataTrigger Binding="{Binding IsChecked}" Value="true"><Setter TargetName="staTree" Property="Background" Value="White"/></DataTrigger></HierarchicalDataTemplate.Triggers></HierarchicalDataTemplate></TreeView.ItemTemplate></TreeView></Border></DockPanel></Grid>
</UserControl>
復制代碼

交互邏輯的代碼中,現在主要有控件數據ItemsSourceData屬性,設置對應Id的項為選中狀態SetCheckedById、忽略層次關系的情況下獲取選中項CheckedItemsIgnoreRelation等方法,以及右鍵的選中所有子項菜單、全部選中、全部取消選中、全部折疊、全部展開等事件,交互邏輯代碼為:

復制代碼
//***************************************************
//
// 文件名(FileName)  : ZsmTreeView.xaml.cs
//
// 作者(Author)      : zsm
//
// 創建時間(CreateAt):  2013-03-15 16:52:40
//
// 描述(Description) : 帶CheckBox的TreeView控件的交互邏輯代碼
//
//***************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace Com.FMS.View.UserControls
{/// <summary>/// ZsmTreeView.xaml 的交互邏輯/// </summary>public partial class ZsmTreeView : UserControl{#region 私有變量屬性/// <summary>/// 控件數據/// </summary>private IList<Model.TreeModel> _itemsSourceData;#endregion/// <summary>/// 構造/// </summary>public ZsmTreeView(){InitializeComponent();}/// <summary>/// 控件數據/// </summary>public IList<Model.TreeModel> ItemsSourceData {get { return _itemsSourceData; }set{_itemsSourceData = value;tvZsmTree.ItemsSource = _itemsSourceData;}}/// <summary>/// 設置對應Id的項為選中狀態/// </summary>/// <param name="id"></param>/// <returns></returns>public int SetCheckedById(string id, IList<Model.TreeModel> treeList) {foreach (var tree in treeList){if (tree.Id.Equals(id)){tree.IsChecked = true;return 1;}if (SetCheckedById(id, tree.Children) == 1){return 1;}}return 0;}/// <summary>/// 設置對應Id的項為選中狀態/// </summary>/// <param name="id"></param>/// <returns></returns>public int SetCheckedById(string id){foreach (var tree in ItemsSourceData){if (tree.Id.Equals(id)){tree.IsChecked = true;return 1;}if (SetCheckedById(id, tree.Children) == 1){return 1;}}return 0;}/// <summary>/// 獲取選中項/// </summary>/// <returns></returns>public IList<Model.TreeModel> CheckedItemsIgnoreRelation(){return GetCheckedItemsIgnoreRelation(_itemsSourceData);}/// <summary>/// 私有方法,忽略層次關系的情況下,獲取選中項/// </summary>/// <param name="list"></param>/// <returns></returns>private IList<Model.TreeModel> GetCheckedItemsIgnoreRelation(IList<Model.TreeModel> list){IList<Model.TreeModel> treeList = new List<Model.TreeModel>();foreach (var tree in list){if (tree.IsChecked){treeList.Add(tree);}foreach (var child in GetCheckedItemsIgnoreRelation(tree.Children)){treeList.Add(child);}}return treeList;}/// <summary>/// 選中所有子項菜單事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void menuSelectAllChild_Click(object sender, RoutedEventArgs e){if (tvZsmTree.SelectedItem != null){Model.TreeModel tree = (Model.TreeModel)tvZsmTree.SelectedItem;tree.IsChecked = true;tree.SetChildrenChecked(true);}}/// <summary>/// 全部展開菜單事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void menuExpandAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsExpanded = true;tree.SetChildrenExpanded(true);}}/// <summary>/// 全部折疊菜單事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void menuUnExpandAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsExpanded = false;tree.SetChildrenExpanded(false);}}/// <summary>/// 全部選中事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void menuSelectAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsChecked = true;tree.SetChildrenChecked(true);}}/// <summary>/// 全部取消選中/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void menuUnSelectAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsChecked = false;tree.SetChildrenChecked(false);}}/// <summary>/// 鼠標右鍵事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e){TreeViewItem item = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;if (item != null){item.Focus();e.Handled = true;}}static DependencyObject VisualUpwardSearch<T>(DependencyObject source){while (source != null && source.GetType() != typeof(T))source = VisualTreeHelper.GetParent(source);return source;}}
}
復制代碼

在使用控件的時候,要在xaml中引入命名控件(根據實際引入)  

xmlns:my="clr-namespace:Com.FMS.View.UserControls"
<!--使用控件-->
<my:ZsmTreeView x:Name="ztvModule" />?
為控件賦值:
ztvModule.ItemsSourceData = treeList;//treeList為IList<TreeModel>類型

??

本文轉自?http://www.cnblogs.com/zsmhhfy/archive/2013/03/18/2965755.html

轉載于:https://www.cnblogs.com/1175429393wljblog/p/7479144.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/253504.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253504.shtml
英文地址,請注明出處:http://en.pswp.cn/news/253504.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

win32框架,GDI圖形編程寫一個HelloWorld游戲_c語言

1.如圖&#xff0c;實現功能: Hello World!字符串跟隨鼠標移動鼠標左擊Hello World!顏色為紅色鼠標右擊Hello World!顏色為藍色鼠標滾輪滾動改變Hello World!顏色的RGB中的G值 2.實現工具: vs20133.實現步驟: 新建一個win32項目 如圖,看到HelloWorldGame.cpp中 _tWinMain()的函…

全景圖像拼接——圖像融合

圖像融合技術就是將配準過后的圖像融合成一幅寬視角、大場景的圖像。但由于圖像采集過程中各種因素的影響,例如光照、角度、距離等,從而導致圖像間的光照不均勻、顏色上不連續。 經過配準以后,參考圖像和輸入圖像已經在同一個坐標系下,如果只是取某一幅圖像的信息或者簡單地…

極詳細的ECC講解 -OOB與ECC

http://blog.csdn.net/dongzhichen/article/details/8249228 詳細的ECC講解 -OOB與ECC 在網絡編程中 OOB&#xff08;out of band&#xff09;帶外數據 在MTD設備中 OOB 如下所示&#xff1a; http://www.cnblogs.com/bcxx_qin/archive/2009/06/11/1501271.html 極詳細的ECC…

前端進階(8) - 前端開發需要了解的工具集合:webpack, eslint, prettier, ...

前端開發需要了解的工具集合&#xff1a;webpack, eslint, prettier, ... 前端開發需要了解的一些工具&#xff0c;這些工具能夠幫助你在項目開發中事半功倍。 1. nrm: npm registry 管理器 registry: npm 遠程倉庫的地址。 由于眾所周知的原因&#xff0c;npm 官方倉庫在國內特…

CMOS圖像傳感器——TOF 圖像傳感器

一、3D成像技術概述 圖像傳感器一直以來都是人類研究的熱點。但隨著當代科學技術發展, 人類對于傳統的 2D 圖像傳感器的要求越來高,不僅期望著更高分辨率,更快速度,更大的動態范圍,人類加希望能夠獲得物體深信息,但是 2D 成 像技術現在已經不能滿足人類的需求,所以應運…

AndroidStudio創建jinLibs文件夾

在文件中的buildTypes節點下添加 sourceSets.main { jniLibs.srcDir libs } 如圖 轉載于:https://www.cnblogs.com/kim-liu/p/7479360.html

內嵌Tomcat的Connector對象的靜態代碼塊

在排查問題的過程中發現Connector對象有一個靜態代碼塊&#xff1a; static {replacements.put("acceptCount", "backlog");replacements.put("connectionLinger", "soLinger");replacements.put("connectionTimeout", &quo…

????YAFFS2文件系統在嵌入式LINUX系統中的應用

YAFFS2文件系統在嵌入式LINUX系統中的應用 2011-03-31 19:59 181人閱讀 評論(0) 收藏 舉報 1&#xff0e;文件系統簡述 隨著32位CPU價格不斷下跌&#xff0c;片上存儲設備的容量相比越來越大&#xff0c;越來越多的嵌入式系統開始應用各種嵌入式操作系統。一般在嵌入式領域&am…

【Python爬蟲學習筆記1】網絡協議及請求基礎

http協議與https協議 HTTP協議(全稱為HyperText Transfer Protocol&#xff0c;超文本傳輸協議)&#xff0c;是發布和接收HTML頁面的方法&#xff0c;其服務端口號為80。 HTTPS協議為HTTP協議的加密版本&#xff0c;其在HTTP下加入了SSL層&#xff0c;服務端口號為443。 URL結構…

快速上手SpyGlass——基本流程

SpyGlass&#xff0c;這是一個很強大的RTL驗證級工具。它不僅僅能檢查sdc的錯誤&#xff0c;還能做以下各種檢查&#xff1a;Low Power, DFT&#xff0c;CDC&#xff08;Cross Domain Check&#xff09;。 一、基本概念 1、方法學相關 Rule: 是SpyGlass 進行RTL分析的最小單…

NAND FLASH ECC

NAND需要ECC以確保數據完整性。NAND閃存的每一個頁面上都包括額外的存儲空間&#xff0c;它就是64個字節的空閑區(每512字節的扇區有16字節)。該區能存儲ECC代碼及其它像磨損評級或邏輯到物理塊映射之類的信息。ECC能在硬件或軟件中執行&#xff0c;但是&#xff0c;硬件執行有…

快速上手SpyGlass——CDC檢查

隨著技術的發展&#xff0c;數字電路的集成度越來越高&#xff0c;設計也越來越復雜。很少有系統會只工作在同一個時鐘頻率。一個系統中往往會存在多個時鐘&#xff0c;這些時鐘之間有可能是同步的&#xff0c;也有可能是異步的。如果一個系統中&#xff0c;異步時鐘之間存在信…

laravel session redis 設置

Laravel 在使用 Redis 作為 Session 驅動之前&#xff0c; 需要通過 Composer 安裝 predis/predis 擴展包 (~1.0)。 當然也可以用原生自帶的&#xff0c;具體使用見 https://laravel-china.org/docs/laravel/5.6/redis/1402#phpredis 操作即可。 然后在database 配置文件中配置…

數字后端——低功耗單元庫

在之前的文章中&#xff0c;介紹了低功耗設計物理實施的方案&#xff1a; 數字后端——低功耗設計物理實施_滄海一升的博客-CSDN博客_低功耗設計低功耗設計方案所涉及到的物理實施相關內容https://blog.csdn.net/qq_21842097/article/details/119918312 為了實現例如門…

【CUDA開發】CUDA面內存拷貝用法總結

【CUDA開發】CUDA面內存拷貝用法總結 標簽&#xff08;空格分隔&#xff09;&#xff1a; 【CUDA開發】 主要是在調試CUDA硬解碼并用D3D9或者D3D11顯示的時候遇到了一些代碼&#xff0c;如下所示&#xff1a; CUdeviceptr g_pRgba 0; CUDA_MEMCPY2D memcpy2D { 0 }; memcp…

PerfMon常用計數器

摘要: 故事來源于《sql server2012 深入解析和性能分析》 1.重要的PerfMon CPU計數器 計數器查看內容發生問題的條件Processor%Processor TimeCPU為生產環境的請求提供服務消耗的時間占總CPU時間的百分比>80%Processor%Privilege Time  CPU為內核模式請求提供服務消耗的時…

NandFlash詳述

1. 硬件特性&#xff1a; 【Flash的硬件實現機制】 Flash全名叫做Flash Memory&#xff0c;屬于非易失性存儲設備(Non-volatile Memory Device)&#xff0c;與此相對應的是易失性存儲設備(Volatile Memory Device)。這類設備&#xff0c;除了Flash&#xff0c;還有其他比較常見…

史上最全的MySQL高性能優化實戰總結!

1.1 前言 MySQL對于很多Linux從業者而言&#xff0c;是一個非常棘手的問題&#xff0c;多數情況都是因為對數據庫出現問題的情況和處理思路不清晰。在進行MySQL的優化之前必須要了解的就是MySQL的查詢過程&#xff0c;很多的查詢優化工作實際上就是遵循一些原則讓MySQL的優化器…

低功耗設計——基于UPF進行設計

UPF&#xff0c; 統一電源格式UPF(Unified Power Format)是新思(Synopsys)公司通用的電源格式&#xff0c;是一組標準的類Tcl 語言的集合&#xff0c;用來描述芯片設計中的低功耗意圖&#xff08;Low-Power Design Intent&#xff09;。 使用UPF 的語言&#xff0c;可以描述供電…

用公眾號獲取 任意公眾號文章列表 軟件還是免費

用公眾號獲取 任意公眾號文章列表 軟件還是免費還不快點下載 下載 地址 https://pan.baidu.com/s/1jI44Wjs轉載于:https://www.cnblogs.com/wx85437898/p/7488590.html