Est-il possible d'utiliser un MenuItem vérifiable comme modèle de contrôle pour RadioButton?

StackOverflow https://stackoverflow.com/questions/654074

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>
Était-ce utile?

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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top