1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > WPF动态加载TabControl

WPF动态加载TabControl

时间:2023-11-15 07:50:52

相关推荐

WPF动态加载TabControl

主要讲一下如何通过点击菜单,实现动态加载TabControl的功能,准确来说应该是动态加载TabItem,要实现这个功能,我们需要解决两个问题:

点击菜单的时候,需要传进来一个你要加载的UserControl控件的名称,让程序知道你要加载的是哪个控件。通过传进来的UserControl控件名实例化UserControl控件(利用反射来实例化UserControl控件)。

关于第一点,我通过在数据库菜单表加一个字段Code,用来保存UserControl控件的名称,然后在加载菜单的时候,给菜单的Name赋上Code的值,关于动态加载菜单可以看我上一篇博客。

在xaml添加一个Name="TabControl"的TabControl

CS后台代码:

我们在添加菜单的时候,根据菜单的Name值是否为空,给菜单添加点击事件

/// <summary>/// 添加菜单的点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Item_Click(object sender, RoutedEventArgs e){MenuItem item = sender as MenuItem;bool isExist = false;foreach (TabItem tab in this.TabControl.Items){//如果已经存在这个TabItem,就把焦点设置到这个TabItem上if (tab.Header == item.Header){isExist = true;tab.Focus();}}//如果不存就添加一个TabItemif (!isExist){//获取命名空间名称(这个名称一定要完整)string str = string.Format("WPFTest.{0}", item.Name);UserControl userControl = ReflectionHelper.CreateInstance<UserControl>(str, "WPFTest");//程序集名称TabItem tabItem = new TabItem(){Header = item.Header,Name = item.Name};tabItem.Content = userControl;this.TabControl.Items.Add(tabItem);tabItem.Focus();}}

添加一个反射帮助类ReflectionHelper,在里面添加一个创建对象实例的方法CreateInstance:

/// <summary>/// 创建对象的实例/// </summary>/// <typeparam name="T"></typeparam>/// <param name="fullName">命名空间.类名</param>/// <param name="assemblyName">程序集名称</param>/// <returns></returns>public static T CreateInstance<T>(string fullName, string assemblyName){//命名空间.类名,程序集名称string path = fullName + "," + assemblyName;//获取加载类型Type o = Type.GetType(path);//根据类型创建实例object obj = Activator.CreateInstance(o, true);//类型转换并返回return (T)obj;}

这样我们就可以动态的实例化UserControl控件对象,实现动态加载TabItem的功能了。

为了方便理解,补上完整代码:

public MainWindow(){InitializeComponent();LoadSystemMenu();}/// <summary>/// 加载菜单/// </summary>public void LoadSystemMenu(){//查询出数据库所有的菜单数据DataTable dataTable = model.GetSystemMenu();//筛选出上级ID为空的数据(一级菜单)DataRow[] dataRows = dataTable.Select("SuperiorID is null");//用来存放一级菜单List<MenuItem> menuItems = new List<MenuItem>();foreach (DataRow item in dataRows){MenuItem menu = new MenuItem();menu.Header = item["Name"].ToString();menu.Name = item["Code"].ToString();//UserControl控件名称menu.RenderSize = new Size(100, 25);//如果Code不为空,就添加点击事件if (!string.IsNullOrWhiteSpace(item["Code"].ToString())) menu.Click += Item_Click;//添加子菜单AddChildMenu(menu, item["ID"].ToString(), dataTable);menuItems.Add(menu);}//把一级菜单绑定到菜单栏foreach (MenuItem item in menuItems){this.SystemMenu.Items.Add(item);}}/// <summary>/// 添加子菜单/// </summary>/// <param name="menu"></param>/// <param name="superiorId"></param>/// <param name="dataTable"></param>private void AddChildMenu(MenuItem menu, string superiorId, DataTable dataTable){//筛选出上级菜单ID等于传进来的菜单ID的数据(子菜单)DataRow[] dataRows = dataTable.Select("SuperiorID =" + superiorId);foreach (DataRow item in dataRows){MenuItem menuItem = new MenuItem();menuItem.Header = item["Name"].ToString();menuItem.Name = item["Code"].ToString();//UserControl控件名称menuItem.RenderSize = new Size(100, 25);if (!string.IsNullOrWhiteSpace(item["Code"].ToString())) menuItem.Click += Item_Click;//绑定子菜单menu.Items.Add(menuItem);AddChildMenu(menuItem, item["ID"].ToString(), dataTable);}}/// <summary>/// 添加菜单的点击事件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void Item_Click(object sender, RoutedEventArgs e){MenuItem item = sender as MenuItem;bool isExist = false;foreach (TabItem tab in this.TabControl.Items){//如果已经存在这个TabItem,就把焦点设置到这个TabItem上if (tab.Header == item.Header){isExist = true;tab.Focus();}}//如果不存就添加一个TabItemif (!isExist){//获取命名空间名称(这个名称一定要完整)string str = string.Format("WPFTest.{0}", item.Name);UserControl userControl = ReflectionHelper.CreateInstance<UserControl>(str, "WPFTest");//程序集名称TabItem tabItem = new TabItem(){Header = item.Header,Name = item.Name};tabItem.Content = userControl;this.TabControl.Items.Add(tabItem);tabItem.Focus();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。