65.9K
CodeProject 正在变化。 阅读更多。
Home

TreeTabControl. 一个选项卡项的树

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (10投票s)

2010年3月28日

CPOL

5分钟阅读

viewsIcon

39912

downloadIcon

3464

处理自定义选项卡项的树

引言

该项目基于一个 WPF 用户控件,该控件由两个主要控件组成:一个 TreeView 和一个 TabControl

这个想法是在我研究如何通过添加用于关闭自身的典型按钮来定制选项卡项的标题外观时产生的。此外,我当时正在开发一个项目,其中我需要 TabItem 能够包含更多 TabItem,就像另一个 TabControl 一样。原因是该控件包含 TreeView。通过 TreeView,可以查看显示的 TabItem 树,并更快地处理它们。

TreeTabControl.jpg

背景

  1. TreeTabControl 是我们必须在自己的项目中使用的用户控件。名为 SelectedTabItem 的属性用于获取当前正在使用的 TreeTabItem。通过使用名为 IsTreeExpanded 的属性或 HideTree()ShowTree() 方法,我们可以隐藏或显示 TreeView
  2. TreeTabItem 是一个继承自 TabItem 并实现 IDisposable 接口的对象。创建此对象的目的是为了更轻松地创建带有自定义标题的 TabItem。通过其构造函数,我们可以选择是否创建带有用于关闭自身的按钮的 TreeTabItemHeader 属性已被修改,只接受一个名为 TabHeader 的用户控件。该用户控件负责通过添加关闭按钮和带有 TabItem 名称的标签来为 TabItem 提供外观。
  3. TreeTabItemGroup 是一个继承自 TreeTabItem 的对象。当创建该对象时,它包含一个 TabControl,以便能够容纳更多的 TreeTabItem
  4. TreeItem 是一个继承自 TreeViewItem 的对象。该对象的主要特点是它包含一个指向链接对象的 TreeTabItem 的指针。然后,根据链接的 TreeTabItem 的类型及其特性,创建的 TreeItem 将能够添加相应的 ContextMenuItem。例如,如果链接的 TreeTabItem 可以关闭,并且其类型是 TreeTabItemGroup(可以包含项目集合),它将添加以下 ContextMenuItem:用于关闭 TreeTabItem 和自身;用于展开它拥有的项目集合;用于折叠集合;用于显示链接的 TreeTabItem。如果 TreeTabItem 无法关闭,它将不包含用于关闭选项卡的 ContextMenuItem。这些 ContextMenuItem 可以通过添加我们的图标来自定义。我将在另一部分解释这一点。
  5. TreeTabConfig 是负责获取控件配置的对象。正如许多人已经知道的,.NET 提供的配置文件只能在正在运行的主项目中 O使用。让我更好地解释一下。如果我们有一个项目需要为其使用的用户控件提供配置文件,那么该配置信息将从主项目的配置文件中获取,而不是从用户控件的配置文件中获取。因此,我想要获得更大的灵活性。TreeTabConfig 将获取库运行时所在的文件夹内的配置文件中的信息。在该文件中,可以定义 ContextMenuItem 图标所在的路径,或者是否要禁用带有图标的菜单。当然,还可以添加更多配置键。该对象包含一些方法,用于从图标文件中获取调整大小后的 Image 对象。
  6. 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日:初始帖子
© . All rights reserved.