我的WPF应用程序中有一个菜单,其中有多个选项,就像一个单选按钮组(选择一个取消选择其余部分)。我想使用可检查的菜单项作为单选按钮的模板。
我试图设置模板,但它似乎没有像人们期望的那样工作。选择和取消选择项目似乎与单选按钮的值不同步。
我想我可以使用更复杂的模板并使用Path或其他东西“伪造”所选标记,但是出于这么简单的目的,它看起来非常多。此外,当使用更复杂的模板时,我必须解决我不想做的不同主题。
这是一个展示问题的简单示例。
<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>
答案 0 :(得分:2)
问题似乎是MenuItem
的鼠标事件处理程序正在接管RadioButton
。当我将IsHitTestVisible
上的MenuItem
设置为 false 并添加Border
来吸收鼠标事件时,它似乎按预期工作:
<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>