【问题标题】:Is it possible to use a checkable MenuItem as control template for RadioButton?是否可以使用可检查的 MenuItem 作为 RadioButton 的控制模板?
【发布时间】:2010-10-13 20:03:05
【问题描述】:

我的 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>

【问题讨论】:

    标签: wpf radio-button controltemplate


    【解决方案1】:

    问题似乎是MenuItem 的鼠标事件处理程序正在接管RadioButton。当我将 MenuItem 上的 IsHitTestVisible 设置为 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>
    

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 1970-01-01
      • 2014-12-13
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多