湖北北京网站建设,wordpress 标签类别,济南市规划局官网,如何做好外贸网站建设WPF 带CheckBox、图标的TreeView 在WPF实际项目开发的时候#xff0c;经常会用到带CheckBox的TreeView#xff0c;虽然微软在WPF的TreeView中没有提供该功能#xff0c;但是微软在WPF中提供强大的ItemTemplate模板功能和自定义样式#xff0c;那我们可以自己写一个这样的控…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值/// /summaryprivate string _id;/// summary/// 显示的名称/// /summaryprivate string _name;/// summary/// 图标路径/// /summaryprivate string _icon;/// summary/// 选中状态/// /summaryprivate bool _isChecked;/// summary/// 折叠状态/// /summaryprivate bool _isExpanded;/// summary/// 子项/// /summaryprivate IListTreeModel _children;/// summary/// 父项/// /summaryprivate TreeModel _parent;#endregion /// summary/// 构造/// /summarypublic TreeModel(){Children new ListTreeModel();_isChecked false;IsExpanded false;_icon /Images/16_16/folder_go.png;}/// summary/// 键值/// /summarypublic string Id{get { return _id; }set { _id value; }}/// summary/// 显示的字符/// /summarypublic string Name{get { return _name; }set { _name value; }}/// summary/// 图标/// /summarypublic string Icon{get { return _icon; }set { _icon value; }}/// summary/// 指针悬停时的显示说明/// /summarypublic string ToolTip {get {return String.Format({0}-{1}, Id, Name);}}/// summary/// 是否选中/// /summarypublic 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/// 是否展开/// /summarypublic bool IsExpanded{get { return _isExpanded; }set{if (value ! _isExpanded){//折叠状态改变_isExpanded value;NotifyPropertyChanged(IsExpanded);}}}/// summary/// 父项/// /summarypublic TreeModel Parent{get { return _parent; }set { _parent value; }}/// summary/// 子项/// /summarypublic IListTreeModel Children{get { return _children; }set { _children value; }}/// summary/// 设置所有子项的选中状态/// /summary/// param nameisChecked/parampublic void SetChildrenChecked(bool isChecked){foreach (TreeModel child in Children){child.IsChecked IsChecked;child.SetChildrenChecked(IsChecked);}}/// summary/// 设置所有子项展开状态/// /summary/// param nameisExpanded/parampublic void SetChildrenExpanded(bool isExpanded) {foreach (TreeModel child in Children){child.IsExpanded isExpanded;child.SetChildrenExpanded(isExpanded);}}/// summary/// 属性改变事件/// /summarypublic event PropertyChangedEventHandler PropertyChanged;private void NotifyPropertyChanged(String info){if (PropertyChanged ! null){PropertyChanged(this, new PropertyChangedEventArgs(info));}}}
} 创建一个用户控件主要含有一个TreeView控件ContextMenu右键菜单项UI代码如下其中的路径请根据实际修改 UserControl x:ClassCom.FMS.View.UserControls.ZsmTreeViewxmlnshttp://schemas.microsoft.com/winfx/2006/xaml/presentationxmlns:xhttp://schemas.microsoft.com/winfx/2006/xamlxmlns:mchttp://schemas.openxmlformats.org/markup-compatibility/2006 xmlns:dhttp://schemas.microsoft.com/expression/blend/2008 xmlns:localclr-namespace:Com.FMS.Modelmc:Ignorabled d:DesignHeight300 d:DesignWidth300GridDockPanelBorder DockPanel.DockBottomStackPanel OrientationHorizontal ToolTip右键有更多功能哦Image Height16 Width16 SourceImages/16_16/emoticon_smile.png/ImageLabel Content右键有更多功能哦 ForegroundGray/Label/StackPanel/BorderBorderTreeView NametvZsmTreeTreeView.ContextMenuContextMenuMenuItem NamemenuExpandAll Header全部展开 ClickmenuExpandAll_ClickMenuItem.IconImage Source/Com.FMS;component/Images/16_16/folder_open_arrow.png //MenuItem.Icon/MenuItemMenuItem NamemenuUnExpandAll Header全部折叠 ClickmenuUnExpandAll_ClickMenuItem.IconImage Source/Com.FMS;component/Images/16_16/folder_close_arrow.png //MenuItem.Icon/MenuItemMenuItem NamemenuSelectAll Header全部选中 ClickmenuSelectAll_ClickMenuItem.IconImage Source/Com.FMS;component/Images/16_16/tick.png //MenuItem.Icon/MenuItemMenuItem NamemenuUnSelectAll Header全部取消 ClickmenuUnSelectAll_ClickMenuItem.IconImage Source/Com.FMS;component/Images/16_16/delete.png //MenuItem.Icon/MenuItem/ContextMenu/TreeView.ContextMenuTreeView.ItemContainerStyleStyle TargetTypeTreeViewItemSetter PropertyIsExpanded Value{Binding IsExpanded, ModeTwoWay}/SetterEventSetter EventTreeViewItem.PreviewMouseRightButtonDown HandlerTreeViewItem_PreviewMouseRightButtonDown//Style/TreeView.ItemContainerStyleTreeView.ItemTemplateHierarchicalDataTemplate DataType{x:Type local:TreeModel} ItemsSource{Binding Children}StackPanel Margin-2,0,0,0 OrientationHorizontal x:NamestaTreeCheckBox ToolTip{Binding ToolTip} FontSize14 FontFamily微软雅黑 Tag{Binding Children} IsChecked{Binding IsChecked, ModeTwoWay}StackPanel OrientationHorizontalImage VerticalAlignmentCenter Source{Binding Icon} /ImageTextBlock Text{Binding Name}/TextBlock/StackPanelCheckBox.ContextMenuContextMenuMenuItem NamemenuSelectAllChild Header全部选中子项 ClickmenuSelectAllChild_ClickMenuItem.IconImage Source/Com.FMS;component/Images/16_16/tick.png //MenuItem.Icon/MenuItem/ContextMenu/CheckBox.ContextMenu/CheckBox/StackPanelHierarchicalDataTemplate.TriggersDataTrigger Binding{Binding IsChecked} ValuetrueSetter TargetNamestaTree PropertyBackground ValueWhite//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 的交互逻辑/// /summarypublic partial class ZsmTreeView : UserControl{#region 私有变量属性/// summary/// 控件数据/// /summaryprivate IListModel.TreeModel _itemsSourceData;#endregion/// summary/// 构造/// /summarypublic ZsmTreeView(){InitializeComponent();}/// summary/// 控件数据/// /summarypublic IListModel.TreeModel ItemsSourceData {get { return _itemsSourceData; }set{_itemsSourceData value;tvZsmTree.ItemsSource _itemsSourceData;}}/// summary/// 设置对应Id的项为选中状态/// /summary/// param nameid/param/// returns/returnspublic int SetCheckedById(string id, IListModel.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 nameid/param/// returns/returnspublic 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/returnspublic IListModel.TreeModel CheckedItemsIgnoreRelation(){return GetCheckedItemsIgnoreRelation(_itemsSourceData);}/// summary/// 私有方法忽略层次关系的情况下获取选中项/// /summary/// param namelist/param/// returns/returnsprivate IListModel.TreeModel GetCheckedItemsIgnoreRelation(IListModel.TreeModel list){IListModel.TreeModel treeList new ListModel.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 namesender/param/// param namee/paramprivate 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 namesender/param/// param namee/paramprivate void menuExpandAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsExpanded true;tree.SetChildrenExpanded(true);}}/// summary/// 全部折叠菜单事件/// /summary/// param namesender/param/// param namee/paramprivate void menuUnExpandAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsExpanded false;tree.SetChildrenExpanded(false);}}/// summary/// 全部选中事件/// /summary/// param namesender/param/// param namee/paramprivate void menuSelectAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsChecked true;tree.SetChildrenChecked(true);}}/// summary/// 全部取消选中/// /summary/// param namesender/param/// param namee/paramprivate void menuUnSelectAll_Click(object sender, RoutedEventArgs e){foreach (Model.TreeModel tree in tvZsmTree.ItemsSource){tree.IsChecked false;tree.SetChildrenChecked(false);}}/// summary/// 鼠标右键事件/// /summary/// param namesender/param/// param namee/paramprivate void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e){TreeViewItem item VisualUpwardSearchTreeViewItem(e.OriginalSource as DependencyObject) as TreeViewItem;if (item ! null){item.Focus();e.Handled true;}}static DependencyObject VisualUpwardSearchT(DependencyObject source){while (source ! null source.GetType() ! typeof(T))source VisualTreeHelper.GetParent(source);return source;}}
} 在使用控件的时候要在xaml中引入命名控件根据实际引入 xmlns:myclr-namespace:Com.FMS.View.UserControls !--使用控件--my:ZsmTreeView x:NameztvModule / 为控件赋值 ztvModule.ItemsSourceData treeList;//treeList为IListTreeModel类型 本文转自 http://www.cnblogs.com/zsmhhfy/archive/2013/03/18/2965755.html 转载于:https://www.cnblogs.com/1175429393wljblog/p/7479144.html