2016-11-21 55 views
0

我有一个为RadioButton定义的Style,其中包含一个由BulletDecorator,VisualStateManager和Triggers组成的ControlTemplate。我目前在XAML代码中的RadioButton上定义了我的GroupName。如何将GroupName添加到RadioButton的ControlTemplate中

运行代码时选择单选按钮并不相互排斥。

我已阅读其他帖子,说问题是在ControlTemplate中定义的第二个RadioButton。我没有定义第二个RadioButton。

这里是选择按钮的图片应该是相互排斥的:

enter image description here

这是我的风格:

<Style x:Key="RadioButtonStyle" TargetType="RadioButton"> 
    <Setter Property="SnapsToDevicePixels" Value="true"/> 
    <Setter Property="OverridesDefaultStyle" Value="true"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Height" Value="15"/> 
    <Setter Property="Margin" Value="5"/> 
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="RadioButton"> 
       <BulletDecorator> 
        <BulletDecorator.Bullet> 
         <Grid Height="{TemplateBinding Height}" Width="{Binding RelativeSource={RelativeSource Self}, Path=Height, UpdateSourceTrigger=PropertyChanged}" MinHeight="15" MinWidth="15"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="1*"/> 
           <ColumnDefinition Width="3*"/> 
           <ColumnDefinition Width="1*"/> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="1*"/> 
           <RowDefinition Height="3*"/> 
           <RowDefinition Height="1*"/> 
          </Grid.RowDefinitions> 
          <Ellipse Name="EllipseMain" 
            Grid.Column="0" Grid.ColumnSpan="3" 
            Grid.Row="0" Grid.RowSpan="3" 
            Fill="Transparent" 
            StrokeThickness="{TemplateBinding BorderThickness}" 
            Stroke="DimGray"/> 
          <Ellipse Name="CheckMark" 
            Grid.Column="1" 
            Grid.Row="1" 
            Opacity="0" 
            Fill="#029cc7"/> 
         </Grid> 
        </BulletDecorator.Bullet> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CommonStates"> 
          <VisualState x:Name="Disabled"> 
           <Storyboard> 
            <ColorAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="LightGray" Duration="0:0:0.3"/> 
            <ColorAnimation Storyboard.TargetName="CheckMain" Storyboard.TargetProperty="(Ellipse.Stroke).(SolidColorBrush.Color)" To="LightGray" Duration="0:0:0.3"/> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
         <VisualStateGroup x:Name="CheckStates"> 
          <VisualState x:Name="Checked"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.3"/> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="UnChecked"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.3"/> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Indeterminate"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.3"/> 
            <ColorAnimation Storyboard.TargetName="CheckMain" Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="Gray" Duration="0:0:0.3"/> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <ContentPresenter Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" RecognizesAccessKey="True"/> 
       </BulletDecorator> 
       <ControlTemplate.Triggers> 
         <Trigger Property="IsPressed" Value="True"> 
          <Setter TargetName="EllipseMain" Property="Fill" Value="#55029cc7"/> 
         </Trigger> 
         <Trigger Property="IsFocused" Value="True"> 
          <Setter TargetName="EllipseMain" Property="Stroke" Value="#88029cc7"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

这里是XAML:

<RadioButton Grid.Row="0" Grid.Column="0" Content="Normal" Foreground="WhiteSmoke" Style="{StaticResource RadioButtonStyle}" GroupName="gpHeadingMode" Margin="0,0,0,0"/> 
<RadioButton Grid.Row="1" Grid.Column="0" Content="Weather Vane" Foreground="WhiteSmoke" Style="{StaticResource RadioButtonStyle}" GroupName="gpHeadingMode" Margin="0,0,0,0"/> 

尝试这是一个工作(在XAML):

<RadioButton Grid.Row="0" Grid.Column="0" x:Name="Normal" Content="Normal" Foreground="WhiteSmoke" GroupName="gpHeadingMode1" 
        Style="{StaticResource RadioButtonStyle}" 
        IsChecked="{Binding HeadingModeChecked, ElementName=HeadingDialog, Converter={StaticResource RbCheckedConverter}, ConverterParameter=Normal, FallbackValue=False}" 
        Click="RbHeadingMode_Click"/> 
<RadioButton Grid.Row="1" Grid.Column="0" x:Name="WeatherVane" Content="Weather Vane" Foreground="WhiteSmoke" GroupName="gpHeadingMode2" 
        Style="{StaticResource RadioButtonStyle}" 
        IsChecked="{Binding HeadingModeChecked, ElementName=HeadingDialog, Converter={StaticResource RbCheckedConverter}, ConverterParameter=WeatherVane, FallbackValue=False}" 
        Click="RbHeadingMode_Click"/> 

在RbHeadingMode_Click中,依赖项对象HeadingModeChecked设置为RadioButton.Name的值。如果我删除了“Style”,转换器将触发并执行切换IsClicked值的工作。

不幸的是,随着风格,转换器不会启动。

现在的问题是,我怎样才能将XAML中的IsChecked属性绑定到样式?

注:实际上,转换器不火特定的风格,但在XAML的变化有器isChecked的单选按钮没有任何影响。

+0

仅供参考:在MSDN上:此属性(GroupName)不能由主题或样式表主题设置 – Radiohead

回答

0

还得从Style删除下面的代码和它的作品:

<VisualStateGroup x:Name="CheckStates"> 
    <VisualState x:Name="Checked"> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.3"/> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="UnChecked"> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="Opacity" To="0" Duration="0:0:0.3"/> 
     </Storyboard> 
    </VisualState> 
    <VisualState x:Name="Indeterminate"> 
     <Storyboard> 
      <DoubleAnimation Storyboard.TargetName="CheckMark" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.3"/> 
      <ColorAnimation Storyboard.TargetName="CheckMain" Storyboard.TargetProperty="(Ellipse.Fill).(SolidColorBrush.Color)" To="Gray" Duration="0:0:0.3"/> 
     </Storyboard> 
    </VisualState> 
</VisualStateGroup> 

注:不仅在器isChecked财产转换器的工作,但现在我可以删除该转换器,只需使用组名来在单选按钮上实现相互排斥!

相关问题