Est-il possible d'utiliser un MenuItem vérifiable comme modèle de contrôle pour RadioButton?
-
19-08-2019 - |
Question
J'ai dans mon application WPF un menu avec plusieurs options qui agissent comme un groupe de boutons radio (en sélectionner une pour en désélectionner le reste). Je souhaite utiliser les éléments de menu pouvant être cochés comme modèles pour les boutons radio.
J'ai essayé de définir le modèle, mais il ne semble pas fonctionner comme on pourrait s'y attendre. La sélection et la désélection d'éléments ne semblent pas être synchronisées avec les valeurs des boutons radio.
Je suppose que je pourrais utiliser un modèle plus complexe et "faux". la marque sélectionnée en utilisant Path ou quelque chose, mais cela semble énormément de travail pour un but aussi simple. De plus, lors de l'utilisation de modèles plus complexes, je devrais aborder différents thèmes que je préférerais ne pas aborder.
Voici un exemple simple pour illustrer le problème.
<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>
La solution
Le problème semblait être que les gestionnaires d'événements de la souris de MenuItem
prenaient le relais pour le RadioButton
. Lorsque j'ai défini IsHitTestVisible
sur MenuItem
sur false et que j'ai ajouté une Bordure
pour absorber les événements de souris, il a semblé que travaillez comme vous le souhaitez:
<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>