Ich denke das Problem ist, dass das TabItem den Mausklick "isst", so dass der RadioButton nie aktiviert/deaktiviert wird. Sie könnten das TabItem in einen Rahmen einbinden und IsHitTestVisible="False"
setzen. Dadurch erhalten Sie den IsMouseOver Trigger usw. verlieren, so dass Sie sie von der Standardvorlage erneut hinzugefügt werden müssen
Versuchen Sie so etwas wie diese
<LinearGradientBrush x:Key="TabItemHotBackground" EndPoint="0,1" StartPoint="0,0">
<GradientStop Color="#EAF6FD" Offset="0.15"/>
<GradientStop Color="#D9F0FC" Offset=".5"/>
<GradientStop Color="#BEE6FD" Offset=".5"/>
<GradientStop Color="#A7D9F5" Offset="1"/>
</LinearGradientBrush>
<SolidColorBrush x:Key="TabItemSelectedBackground" Color="#F9F9F9"/>
<SolidColorBrush x:Key="TabItemHotBorderBrush" Color="#3C7FB1"/>
<Style x:Key="RadioButtonStyle1" TargetType="{x:Type RadioButton}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Border BorderBrush="Transparent" BorderThickness="0" Background="Transparent" CornerRadius="0">
<TabItem x:Name="tabItem" IsSelected="{TemplateBinding IsChecked}" IsHitTestVisible="False">
<TabItem.Header>
<ContentPresenter Margin="5"/>
</TabItem.Header>
</TabItem>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="true">
<Setter Property="Background" TargetName="tabItem" Value="{StaticResource TabItemHotBackground}"/>
</Trigger>
<Trigger Property="IsChecked" Value="true">
<Setter Property="Panel.ZIndex" Value="1"/>
<Setter Property="Background" TargetName="tabItem" Value="{StaticResource TabItemSelectedBackground}"/>
</Trigger>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsChecked" Value="false"/>
<Condition Property="IsMouseOver" Value="true"/>
</MultiTrigger.Conditions>
<Setter Property="BorderBrush" TargetName="tabItem" Value="{StaticResource TabItemHotBorderBrush}"/>
</MultiTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
aktualisiert
<ControlTemplate TargetType="RadioButton">
<Border BorderBrush="Transparent" BorderThickness="0" Background="Transparent" CornerRadius="0">
<TabItem x:Name="tabItem" IsSelected="{TemplateBinding IsChecked}" IsHitTestVisible="False">
<TabItem.Header>
<ContentPresenter Margin="5"/>
</TabItem.Header>
</TabItem>
</Border>
</ControlTemplate>
Update 2
Sie können ein Attached Behavior verwenden, um das MouseDown-Ereignis im RadioButton auszulösen, wenn auf das TabItem geklickt wird. Alternativ könnte man einfach IsChecked = „True“ statt Erhöhung der Click-Ereignis
<ControlTemplate TargetType="RadioButton">
<TabItem x:Name="tabItem" IsSelected="{TemplateBinding IsChecked}"
local:LinkWithRadioButtonBehavior.LinkWithRadioButton="True">
<TabItem.Header>
<ContentPresenter Margin="5"/>
</TabItem.Header>
</TabItem>
</ControlTemplate>
LinkWithRadioButtonBehavior
public static class LinkWithRadioButtonBehavior
{
public static readonly DependencyProperty LinkWithRadioButtonProperty =
DependencyProperty.RegisterAttached
(
"LinkWithRadioButton",
typeof(bool),
typeof(LinkWithRadioButtonBehavior),
new UIPropertyMetadata(false, OnLinkWithRadioButtonPropertyChanged)
);
public static bool GetLinkWithRadioButton(DependencyObject obj)
{
return (bool)obj.GetValue(LinkWithRadioButtonProperty);
}
public static void SetLinkWithRadioButton(DependencyObject obj, bool value)
{
obj.SetValue(LinkWithRadioButtonProperty, value);
}
private static void OnLinkWithRadioButtonPropertyChanged(DependencyObject dpo,
DependencyPropertyChangedEventArgs e)
{
Control control = dpo as Control;
if (control != null)
{
if ((bool)e.NewValue == true)
{
control.PreviewMouseDown += OnMouseDown;
}
else
{
control.PreviewMouseDown -= OnMouseDown;
}
}
}
static void OnMouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
Control control = sender as Control;
MouseButtonEventArgs routedEventArgs = new MouseButtonEventArgs(Mouse.PrimaryDevice, 0, MouseButton.Left);
routedEventArgs.RoutedEvent = RadioButton.MouseDownEvent;
routedEventArgs.Source = control;
RadioButton clickedRadioButton = GetVisualParent<RadioButton>(control);
clickedRadioButton.RaiseEvent(routedEventArgs);
}
public static T GetVisualParent<T>(object childObject) where T : Visual
{
DependencyObject child = childObject as DependencyObject;
while ((child != null) && !(child is T))
{
child = VisualTreeHelper.GetParent(child);
}
return child as T;
}
}
Jeder Grund, warum Sie nicht nur ein TabControl mit ein paar TabItems darin verwenden würden? –
Weil ich meinen Inhalt nicht in einer Vorlage deklarieren will, sondern den gleichen Inhalt für jede Registerkarte. – Shimmy