È possibile utilizzare un MenuItem controllabile come modello di controllo per RadioButton?

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

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>
È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top