【发布时间】:2017-11-09 02:57:14
【问题描述】:
我想继承默认的TabControl并处理双击TabItem Header事件。
这是 XAML 文件:
<local:MyTabControl x:Class="MyTabControl"
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:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:CustomizedTabControl"
mc:Ignorable="d">
<local:MyTabControl.Style>
<Style TargetType="{x:Type local:MyTabControl}" BasedOn="{StaticResource {x:Type TabControl}}">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type TabItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Label Content="{Binding}">
<Label.Style>
<Style TargetType="Label">
<EventSetter Event="MouseDoubleClick" Handler="OnTabHeaderDoubleClick"/>
</Style>
</Label.Style>
</Label>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
</local:MyTabControl.Style>
这是代码隐藏:
using System.Windows.Controls;
using System.Windows.Input;
namespace CustomizedTabControl
{
public partial class MyTabControl : TabControl
{
public MyTabControl() : base()
{
}
public void OnTabHeaderDoubleClick(object sender, MouseButtonEventArgs e)
{
// Never call
}
}
}
但永远不会调用事件处理程序。你有什么想法吗?
P/S:这是我使用自定义TabControl的代码:
<Window x:Class="CustomizedTabControl.MainWindow"
...
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:MyTabControl x:Name="tabControl">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5"/>
</TabItem>
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5"/>
</TabItem>
</local:MyTabControl>
</Grid>
</Window>
【问题讨论】:
-
你的风格事件被应用了吗?如何创建控件的实例?
-
@mm8 我刚刚发布了使用 MyTabControl 的 XAML 部分。我不明白您对“是否应用了您的样式事件”的想法。能稍微解释一下吗?
-
这个问题应该是不言自明的。您的样式未应用。如果将 TabItems 添加到 TabControl,则永远不会应用 ItemContainerStyle。
-
@mm8 如果我不继承 TabControl 而只是自定义 MainWindow.cs.xaml 中的 TabControl 样式,则代码可以工作。但是该事件是在 MainWindow.cs 文件中处理的,现在我想在 TabControl 子类中处理该事件。我认为风格很好还是我误解了什么?
标签: wpf inheritance customization tabcontrol double-click