TreeTabControl. 一个选项卡项的树






4.67/5 (10投票s)
处理自定义选项卡项的树
引言
该项目基于一个 WPF 用户控件,该控件由两个主要控件组成:一个 TreeView
和一个 TabControl
。
这个想法是在我研究如何通过添加用于关闭自身的典型按钮来定制选项卡项的标题外观时产生的。此外,我当时正在开发一个项目,其中我需要 TabItem
能够包含更多 TabItem
,就像另一个 TabControl
一样。原因是该控件包含 TreeView
。通过 TreeView
,可以查看显示的 TabItem
树,并更快地处理它们。

背景
TreeTabControl
是我们必须在自己的项目中使用的用户控件。名为SelectedTabItem
的属性用于获取当前正在使用的TreeTabItem
。通过使用名为IsTreeExpanded
的属性或HideTree()
和ShowTree()
方法,我们可以隐藏或显示TreeView
。TreeTabItem
是一个继承自TabItem
并实现IDisposable
接口的对象。创建此对象的目的是为了更轻松地创建带有自定义标题的TabItem
。通过其构造函数,我们可以选择是否创建带有用于关闭自身的按钮的TreeTabItem
。Header
属性已被修改,只接受一个名为TabHeader
的用户控件。该用户控件负责通过添加关闭按钮和带有TabItem
名称的标签来为TabItem
提供外观。TreeTabItemGroup
是一个继承自TreeTabItem
的对象。当创建该对象时,它包含一个TabControl
,以便能够容纳更多的TreeTabItem
。TreeItem
是一个继承自TreeViewItem
的对象。该对象的主要特点是它包含一个指向链接对象的TreeTabItem
的指针。然后,根据链接的TreeTabItem
的类型及其特性,创建的TreeItem
将能够添加相应的ContextMenuItem
。例如,如果链接的TreeTabItem
可以关闭,并且其类型是TreeTabItemGroup
(可以包含项目集合),它将添加以下ContextMenuItem
:用于关闭TreeTabItem
和自身;用于展开它拥有的项目集合;用于折叠集合;用于显示链接的TreeTabItem
。如果TreeTabItem
无法关闭,它将不包含用于关闭选项卡的ContextMenuItem
。这些ContextMenuItem
可以通过添加我们的图标来自定义。我将在另一部分解释这一点。TreeTabConfig
是负责获取控件配置的对象。正如许多人已经知道的,.NET 提供的配置文件只能在正在运行的主项目中 O使用。让我更好地解释一下。如果我们有一个项目需要为其使用的用户控件提供配置文件,那么该配置信息将从主项目的配置文件中获取,而不是从用户控件的配置文件中获取。因此,我想要获得更大的灵活性。TreeTabConfig
将获取库运行时所在的文件夹内的配置文件中的信息。在该文件中,可以定义ContextMenuItem
图标所在的路径,或者是否要禁用带有图标的菜单。当然,还可以添加更多配置键。该对象包含一些方法,用于从图标文件中获取调整大小后的Image
对象。DisposingMethod
。嗯,也许这个类不应该包含在这里,但我最终还是决定保留它。该类的目的是在TreeTabItem
被垃圾回收器收集时(换句话说,当它从内存中移除时)执行在TreeTabControl
外部声明的方法。也许有人会发现它有用。我想在TreeTabItem
被关闭并从集合中释放时获取控件,并且我想在发生这种情况时执行一个方法。由于 WPF 不支持对象的 Dispose 事件,我找到了这种方法。它很简单,基本上工作方式如下:TreeTabItem
实现IDisposable
。当调用Close()
方法时,它会注册自己以供下次垃圾回收。TreeTabItem
有一个析构函数。当对象正在被销毁时,对象会检查其DisposingMethod
属性是否不为null
。如果是,它将通过Execute
方法执行DisposingMethod
对象中的反射方法。另外,请注意,TreeTabItem
的内容必须实现IDisposable
接口,因为当TreeTabItem
关闭时,它将调用其内容的Dispose()
方法。因此,如果我们对此感兴趣,当我们的选项卡正在关闭自身并且我们希望在我们的内容控件中发生一个事件时,我们可以准备Dispose()
方法来实现它。或者,如果该方法位于内容控件之外,我们可以使用DisposingMethod
类。
Using the Code
将 TreeTabControl 添加到您的应用程序
首先,您必须在项目中添加库的引用。转到“References-> Add Reference...-> Browse”并选择库。添加库后,我们必须在应用程序的头部声明程序集,创建控件使用的命名空间。例如:
<window margin="0,0,0,0" title="Window1"
xmlns:custom="clr-namespace:TreeTab;assembly=TreeTab"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
x:class="TreeTabTest.Window1">
声明后,我们可以添加控件。例如:
<custom:TreeTabControl Name="treeTab" IsTreeExpanded="True">
隐藏和显示 TreeView
正如我之前所说,如果您认为 TreeView
没有用,您可以显示和隐藏它。这很简单,我们只需操作父网格的列,删除和创建列并设置控件的可见性。
public void HideTree()
{
if (this.isTreeExpanded)
{
this.treeView.Visibility = Visibility.Collapsed;
this.ContentGrid.ColumnDefinitions.RemoveAt(0);
this.isTreeExpanded = false;
}
}
public void ShowTree()
{
if (!this.isTreeExpanded)
{
ColumnDefinition col = new ColumnDefinition();
col.Width = new GridLength(150);
this.ContentGrid.ColumnDefinitions.Insert(0, col);
this.treeView.Visibility = Visibility.Visible;
this.isTreeExpanded = true;
}
}
在标题中添加没有关闭按钮的选项卡
private void btnAddTab1_Click(object sender, RoutedEventArgs e)
{
this.treeTab.AddTabItem("one", "Main Tab", false, TreeItem.TREEITEM_TYPE.MAIN);
}
将三个选项卡添加到另一个父选项卡
请注意,名为 <treetab> 的对象是实例。在向集合添加新的 <treetabitem> 时,请注意其 <id> 必须是唯一的。如果控件发现您试图使用的 <id> 已在使用中,则新的 TreeTabItem
将被忽略并且不会被添加。例如:
private void btnAddTab3_Click(object sender, RoutedEventArgs e)
{
TreeTabItemGroup tParent = (TreeTabItemGroup) this.treeTab.GetTabItemById("two");
TreeTabItem tItem = this.treeTab.AddTabItem
("tree", "Child Group 1", true, TreeItem.TREEITEM_TYPE.MAIN, tParent);
TreeTabIGroupGrid grid = new TreeTabIGroupGrid();
grid.Children.Add(new Example());
this.treeTab.SetTabContent(tItem, grid);
this.treeTab.AddTabItem("four", "Child Group 2",
true, TreeItem.TREEITEM_TYPE.MAIN, tParent);
this.treeTab.AddTabItem("five", "Child Group 3",
true, TreeItem.TREEITEM_TYPE.MAIN, tParent);
}
将图标文件链接到 ContextMenuItem
当您想向集合添加新的 <contextmenuitem> 并希望该项显示自定义图标时,您必须使用配置文件部分中将使用的相同 <id> 键进行创建。例如:
<configSections>
<section name="ContextMenuIcons"
type="System.Configuration.SingleTagSectionHandler" />
</configSections>
<ContextMenuIcons>
<icon id="Close" fileName="LinkBack.ico"/>
<icon id="Expand" fileName="Add.ico"/>
<icon id="Collapse" fileName="Remove.ico"/>
<icon id="Show" fileName=""/>
</ContextMenuIcons>
历史
- 2010年3月28日:初始帖子