Ist es möglich, eine überprüfbare MenuItem als Steuervorlage für RadioButton- zu benutzen?
-
19-08-2019 - |
Frage
Ich habe ein Menü in meiner WPF-Anwendung mit mehreren Optionen, die wie eine Optionsfeld-Gruppe handeln (die Auswahl einer Abwahl Rest von ihnen). Ich möchte überprüfbar Menüpunkte als Vorlagen für die Radio-Buttons verwenden.
Ich habe versucht, die Vorlage zu setzen, aber es scheint nicht zu funktionieren, wie man erwarten würde. Auswählen und Abwählen Elemente scheinen nicht mit Radio-Buttons' Wert synchronisiert werden.
Ich glaube, ich komplexere Vorlage verwenden könnte und „fake“ die gewählte Markierung mit Pfad oder etwas, aber es scheint furchtbar viel Arbeit für einen solchen einfachen Zweck. Auch wenn komplexere Vorlage würde ich zu verschiedenen Themen befassen, die ich lieber nicht tun will.
Hier ist ein einfaches Beispiel, das Problem zu demonstrieren.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<ControlTemplate x:Key="Template" TargetType="{x:Type RadioButton}">
<MenuItem x:Name="item" Header="{TemplateBinding Content}" IsCheckable="True" IsChecked="False" />
<ControlTemplate.Triggers>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="item" Property="IsChecked" Value="True" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Page.Resources>
<StackPanel>
<RadioButton Content="Foo" Template="{StaticResource Template}"/>
<RadioButton Content="Bar" Template="{StaticResource Template}"/>
<RadioButton Content="Biz" Template="{StaticResource Template}"/>
</StackPanel>
</Page>
Lösung
Das Problem schien zu sein, dass die Maus-Event-Handler des MenuItem
wurden für die RadioButton
übernehmen. Als ich IsHitTestVisible
auf dem MenuItem
auf false gesetzt und hat eine Border
Mausereignisse zu genießen, es schien, als Sie zu arbeiten erwarten:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Page.Resources>
<ControlTemplate x:Key="Template" TargetType="{x:Type RadioButton}">
<Border Background="Transparent">
<MenuItem Header="{TemplateBinding Content}" IsCheckable="False" IsChecked="{TemplateBinding IsChecked}" IsHitTestVisible="False"/>
</Border>
</ControlTemplate>
</Page.Resources>
<StackPanel>
<RadioButton Content="Foo" IsChecked="True" Template="{StaticResource Template}"/>
<RadioButton Content="Bar" Template="{StaticResource Template}"/>
<RadioButton Content="Biz" Template="{StaticResource Template}"/>
</StackPanel>
</Page>