Pergunta

Eu tenho um menu no meu aplicativo WPF com várias opções que agem como um grupo de botões de rádio (selecionando um Desmarca resto deles). Eu gostaria de usar itens de menu checkable como modelos para os botões de rádio.

Eu tentei definir o modelo, mas não parecem funcionar como seria de esperar. Seleção e itens desmarcando não parecem ser sincronizados com os valores de rádio botões.

Eu acho que eu poderia usar o modelo mais complexo e "fake" a marca selecionada usando Path ou algo assim, mas parece terrivelmente muito trabalho para um propósito tão simples. Além disso, quando usando o modelo mais complexo que eu teria que abordar diferentes temas que eu preferiria não querem fazer.

Aqui está um exemplo simples para demonstrar o 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>
Foi útil?

Solução

O problema parecia ser que os manipuladores de eventos do mouse do MenuItem estavam tomando para o RadioButton. Quando eu set IsHitTestVisible na MenuItem para false e acrescentou um Border para absorver eventos de mouse, parecia trabalho como você espera:

<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>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top