Pregunta

Tengo un menú en mi aplicación WPF con múltiples opciones que actúan como un grupo de botones de radio (al seleccionar uno deselecciona el resto). Me gustaría utilizar elementos de menú marcables como plantillas para botones de radio.

He intentado configurar la plantilla pero no parece funcionar como cabría esperar. Seleccionar y anular la selección de elementos no parece estar sincronizado con los valores de los botones de opción.

Supongo que podría usar plantillas más complejas y "falsas" la marca seleccionada usando Path o algo así, pero parece mucho trabajo para un propósito tan simple. Además, cuando use una plantilla más compleja, tendría que abordar diferentes temas que preferiría no querer hacer.

Aquí hay un ejemplo simple para demostrar el 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>
¿Fue útil?

Solución

El problema parecía ser que los controladores de eventos del mouse de MenuItem estaban asumiendo el control del RadioButton . Cuando configuré IsHitTestVisible en el MenuItem en false y agregué un Border para absorber los eventos del mouse, parecía que trabaje como 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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top