WPF-继承选项卡控件并自定义样式
我想继承默认的TabControl并处理双击TabItem Header事件 这是XAML文件:WPF-继承选项卡控件并自定义样式,wpf,inheritance,customization,tabcontrol,double-click,Wpf,Inheritance,Customization,Tabcontrol,Double Click,我想继承默认的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://schema
<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>
但从未调用事件处理程序。你知道吗
p/S:这是我在自定义选项卡控件中使用的代码:
<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>
我无法理解为什么我在MyTabControl的XAML文件中定义的样式不起作用。然而,这是我使用的解决方法。我必须使用DictionarySource来捕捉事件 xaml文件:
<ResourceDictionary x:Class="CustomizedTabControl.MyTabControlResourceDictionary"
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">
<Style BasedOn="{StaticResource {x:Type TabControl}}" TargetType="{x:Type local:MyTabControl}" x:Key="MyTabControlStyle">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type TabItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Label Content="{Binding}" Background="Blue" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyTabControl}}}">
<Label.Style>
<Style TargetType="Label">
<EventSetter Event="MouseDoubleClick" Handler="OnTabHeaderDoubleClick"/>
</Style>
</Label.Style>
</Label>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
添加以下是我使用它的方式:
<Grid>
<local:MyTabControl x:Name="tabControl" Style="{StaticResource MyTabControlStyle}">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5"/>
</TabItem>
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5"/>
</TabItem>
</local:MyTabControl>
</Grid>
我无法理解为什么我在MyTabControl的XAML文件中定义的样式不起作用。然而,这是我使用的解决方法。我必须使用DictionarySource来捕捉事件 xaml文件:
<ResourceDictionary x:Class="CustomizedTabControl.MyTabControlResourceDictionary"
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">
<Style BasedOn="{StaticResource {x:Type TabControl}}" TargetType="{x:Type local:MyTabControl}" x:Key="MyTabControlStyle">
<Setter Property="ItemContainerStyle">
<Setter.Value>
<Style TargetType="{x:Type TabItem}">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Label Content="{Binding}" Background="Blue" Tag="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyTabControl}}}">
<Label.Style>
<Style TargetType="Label">
<EventSetter Event="MouseDoubleClick" Handler="OnTabHeaderDoubleClick"/>
</Style>
</Label.Style>
</Label>
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
添加以下是我使用它的方式:
<Grid>
<local:MyTabControl x:Name="tabControl" Style="{StaticResource MyTabControlStyle}">
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5"/>
</TabItem>
<TabItem Header="TabItem">
<Grid Background="#FFE5E5E5"/>
</TabItem>
</local:MyTabControl>
</Grid>
是否应用了您的样式事件?如何创建该控件的实例?@mm8我刚刚发布了XAML中使用MyTabControl的部分。我不明白你对“你的风格是否适用”的看法。你能解释一下吗?这个问题应该是不言自明的。您的样式不适用。如果将TabItems添加到TabControl中,则永远不会应用ItemContainerStyle。@mm8如果我不继承TabControl,而只在MainWindow.cs.xaml中自定义TabControl样式,则代码有效。但是,事件是在MainWindow.cs文件中处理的,现在我想在TabControl子类中处理该事件。我觉得这个风格很好,或者我误解了什么?你的风格事件适用吗?如何创建该控件的实例?@mm8我刚刚发布了XAML中使用MyTabControl的部分。我不明白你对“你的风格是否适用”的看法。你能解释一下吗?这个问题应该是不言自明的。您的样式不适用。如果将TabItems添加到TabControl中,则永远不会应用ItemContainerStyle。@mm8如果我不继承TabControl,而只在MainWindow.cs.xaml中自定义TabControl样式,则代码有效。但是,事件是在MainWindow.cs文件中处理的,现在我想在TabControl子类中处理该事件。我觉得风格不错,或者我误解了什么?