È possibile utilizzare un MenuItem controllabile come modello di controllo per RadioButton?
-
19-08-2019 - |
Domanda
Ho un menu nella mia applicazione WPF con più opzioni che si comportano come un gruppo di pulsanti di opzione (selezionandone uno deseleziona il resto). Vorrei utilizzare le voci di menu controllabili come modelli per i pulsanti di opzione.
Ho provato a impostare il modello ma non sembra funzionare come ci si aspetterebbe. La selezione e la deselezione di elementi non sembrano essere sincronizzati con i valori dei pulsanti di opzione.
Immagino di poter usare un modello più complesso e " falso " il segno selezionato usando Path o qualcosa del genere ma sembra terribilmente molto lavoro per uno scopo così semplice. Inoltre, quando uso un modello più complesso, dovrei affrontare diversi temi che preferirei non voler fare.
Ecco un semplice esempio per dimostrare il problema.
<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>
Soluzione
Il problema sembrava essere che i gestori di eventi del mouse del MenuItem
prendessero il posto del RadioButton
. Quando ho impostato IsHitTestVisible
su MenuItem
su false e ho aggiunto un Border
per assorbire gli eventi del mouse, mi è sembrato di lavorare come previsto:
<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>