¿Es posible usar un MenuItem comprobable como plantilla de control para RadioButton?
-
19-08-2019 - |
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>
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>