É possível usar um MenuItem verificável como modelo de controle para RadioButton?
-
19-08-2019 - |
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>
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>