TabControl
表示包含多个项的控件,这些项共享屏幕上的同一空间。
TabControl有助于最大程度地减少屏幕空间使用量,同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个 TabItem 对象。一次只能看到 TabControl 中的一个 TabItem 。 当用户选择的 TabItem 选项卡时,将显示 TabItem 的内容,并且隐藏其他 TabItem 对象的内容。
TabControl 为 ItemsControl ,这意味着它可以包含任何类型的对象的集合 (例如字符串、图像或面板) 。 有关更多信息,请参见 ItemsControl 类。
名称 | 备注 | 权限 |
---|---|---|
标识 ContentStringFormat 依赖项属性。 | public static readonly | |
标识 ContentTemplate 依赖项属性。 | public static readonly | |
标识 ContentTemplateSelector 依赖项属性。 | public static readonly | |
标识 SelectedContent 依赖项属性。 | public static readonly | |
标识 SelectedContentStringFormat 依赖项属性。 | public static readonly | |
标识 SelectedContentTemplate 依赖项属性。 | public static readonly | |
标识 SelectedContentTemplateSelector 依赖项属性。 | public static readonly | |
标识 TabStripPlacement 依赖项属性。 | public static readonly |
名称 | 备注 | 权限 |
---|---|---|
获取一个撰写字符串,该字符串指定如果 TabItem 对象的内容显示为字符串,应如何设置这些内容的格式。 | get; | |
获取或设置 DataTemplate 以应用于所有未定义 TabItem 或 ContentTemplate 属性的 ContentTemplateSelector。 | get; set; | |
获取或设置为选择用于显示控件内容的模板提供自定义逻辑的 DataTemplateSelector。 | get; set; | |
获取当前选择的 TabItem 的内容。 | get; | |
获取一个撰写字符串,该字符串指定如果当前选定的 TabItem 的内容显示为字符串,应如何设置该内容的格式。 | get; | |
获取当前所选项的 DataTemplate。 | get; | |
获取当前所选项的 DataTemplateSelector。 | get; | |
获取或设置选项卡标题如何相对于选项卡内容进行对齐。 | get; set; |
名称 | 备注 | 权限 |
---|---|---|
创建或标识用于显示指定项的元素。 | protected | |
确定指定项是否是(或可作为)其自己的 ItemContainer 。 |
protected | |
调用 ApplyTemplate() 时进行调用。 | protected | |
提供 TabControlAutomationPeer 此控件的适当实现,作为 WPF 自动化基础结构的一部分。 | protected | |
当 IsInitialized 设置为 true 时调用。 |
protected | |
调用以在项更改时更新当前选择。 | protected | |
为用户按任意键时引发的 KeyDown 路由事件提供类处理。 | protected | |
引发 SelectionChanged 路由事件。 | protected |
TabItem
表示 TabControl 内某个可选择的项。
TabItem 为 HeaderedContentControl。 它的内容属性为 Content ,并且其标头属性为 Header 。 有关更多信息,请参见 HeaderedContentControl 类。
自定义 TabControl 控件
若要对多个TabItem控件应用相同的属性设置 ,请使用 Style 属性。 您可以修改ControlTemplate 默认值 ,为控件指定独特的外观。 有关创建ControlTemplate的详细信息 ,请参阅 通过创建 System.windows.controls.controltemplate> 自定义现有控件的外观。 若要查看特定于 TabItem 的部分和状态,请参阅 TabControl 样式和模板。
此控件的依赖属性可能由控件的默认样式设置。 如果按默认样式设置属性,则当控件出现在应用程序中时,属性可能会更改为默认值。 默认样式取决于应用程序运行时使用的桌面主题。 有关详细信息,请参阅 默认的 WPF 主题。
只有视觉对象属性已存在于控件的默认模板中并且已使用 TemplateBinding 设置时,设置该属性才有效。 在通过创建 ControlTemplate 自定义现有控件的外观一文的更改控件的视觉结构部分可以找到视觉属性列表。
名称 | 备注 | 权限 |
---|---|---|
标识 IsSelected 依赖项属性。 | public static readonly | |
标识 TabStripPlacement 依赖项属性。 | public static readonly |
名称 | 备注 | 权限 |
---|---|---|
获取或设置一个值,该值指示是否选择 TabItem。 | get; set; | |
获取选项卡区域位置。 | get; |
名称 | 备注 | 权限 |
---|---|---|
在调用 AccessKey 的 TabControl 时响应。 | protected | |
当 Content 属性更改时调用。 | protected | |
当 ContentTemplate 属性更改时调用。 | protected | |
当 ContentTemplateSelector 属性更改时调用。 | protected | |
提供 TabItemAutomationPeer 此控件的适当实现,作为 WPF 自动化基础结构的一部分。 | protected | |
响应 MouseLeftButtonDown 事件。 | protected | |
宣布键盘焦点位于此元素上。 | protected | |
调用以指示 IsSelected 属性已更改为 true 。 |
protected | |
调用以指示 IsSelected 属性已更改为 false 。 |
protected |
TabControl有一个比较重要的属性TabStripPlacement,它决定选项卡的位置。是一个Dock属性值,指示选项卡停靠在控件的上、下、左、右。默认值为 Top。
TabControl派生自Selector。
Selector有几个比较重要的属性:
- SelectedIndex:获取或设置当前选择中第一项的索引,如果选择为空,则返回负一(-1)。
- SelectedItem:获取或设置当前选择中的第一项,或者,如果选择为空,则返回 null。
- SelectedValue:获取或设置通过使用 SelectedItem 而获取的 SelectedValuePath 的值。
- SelectedValuePath:获取或设置用于从 SelectedValue 获取 SelectedItem 的路径。
Selector的事件:
- SelectionChanged:当 Selector 的选择更改时发生。
TabItem是TabControl中的项。
TabItem派生自HeaderedContentControl:
- Header:标题。
- Content:内容。
- IsSelected:获取或设置一个值,该值指示是否选择 TabItem。
- TabStripPlacement :无法设置,从父级获取。
XAML范例
<Window
x:Class="TabControlDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TabControlDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
Title="MainWindow"
Width="500"
Height="300"
mc:Ignorable="d">
<TabControl SelectedIndex="1" SelectionChanged="OnSelectionChanged" TabStripPlacement="Right">
<TabItem Header="TabItem1">
<StackPanel>
<Label />
<Button Content="TabItem2 IsSelected" Click="OnTabItem2"/>
</StackPanel>
</TabItem>
<TabItem Header="TabItem2">
<StackPanel>
<Label />
<Button Content="TabItem1 IsSelected" Click="OnTabItem1"/>
</StackPanel>
</TabItem>
</TabControl>
</Window>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 TabControlDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in (((sender as TabControl).SelectedItem as TabItem).Content as StackPanel).Children)
{
if(item is Label) (item as Label).Content = "SelectedIndex: " + (sender as TabControl).SelectedIndex.ToString();
}
}
private void OnTabItem2(object sender, RoutedEventArgs e)
{
List<TabItem> tabItems = new List<TabItem>();
foreach (var item in ((((sender as Button).Parent as StackPanel).Parent as TabItem).Parent as TabControl).Items)
{
if (item is TabItem) tabItems.Add(item as TabItem);
}
tabItems[1].IsSelected = true;
}
private void OnTabItem1(object sender, RoutedEventArgs e)
{
List<TabItem> tabItems = new List<TabItem>();
foreach (var item in ((((sender as Button).Parent as StackPanel).Parent as TabItem).Parent as TabControl).Items)
{
if (item is TabItem) tabItems.Add(item as TabItem);
}
tabItems[0].IsSelected = true;
}
}
}
C#范例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
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 TabControlDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
TabControl tabControl = new TabControl();
tabControl.SelectedItem = 1;
tabControl.SelectionChanged += OnSelectionChanged;
tabControl.TabStripPlacement = Dock.Right;
TabItem tabItem1 = new TabItem();
TabItem tabItem2 = new TabItem();
StackPanel stackPanel1 = new StackPanel();
StackPanel stackPanel2 = new StackPanel();
Label label1 = new Label();
Label label2 = new Label();
Button button1 = new Button();
Button button2 = new Button();
button1.Content = "TabItem2 IsSelected";
button1.Click += OnTabItem2;
button2.Content = "TabItem1 IsSelected";
button2.Click += OnTabItem1;
stackPanel1.Children.Add(label1);
stackPanel1.Children.Add(button1);
stackPanel2.Children.Add(label2);
stackPanel2.Children.Add(button2);
tabItem1.Header = "TabItem1";
tabItem1.Content = stackPanel1;
tabItem2.Header = "TabItem2";
tabItem2.Content = stackPanel2;
tabControl.Items.Add(tabItem1);
tabControl.Items.Add(tabItem2);
this.Content = tabControl;
}
private void OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
foreach (var item in (((sender as TabControl).SelectedItem as TabItem).Content as StackPanel).Children)
{
if(item is Label) (item as Label).Content = "SelectedIndex: " + (sender as TabControl).SelectedIndex.ToString();
}
}
private void OnTabItem2(object sender, RoutedEventArgs e)
{
List<TabItem> tabItems = new List<TabItem>();
foreach (var item in ((((sender as Button).Parent as StackPanel).Parent as TabItem).Parent as TabControl).Items)
{
if (item is TabItem) tabItems.Add(item as TabItem);
}
tabItems[1].IsSelected = true;
}
private void OnTabItem1(object sender, RoutedEventArgs e)
{
List<TabItem> tabItems = new List<TabItem>();
foreach (var item in ((((sender as Button).Parent as StackPanel).Parent as TabItem).Parent as TabControl).Items)
{
if (item is TabItem) tabItems.Add(item as TabItem);
}
tabItems[0].IsSelected = true;
}
}
}