2016-11-21 35 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財產轉換器的工作,但現在我可以刪除該轉換器,只需使用組名來在單選按鈕上實現相互排斥!

相關問題