2017-07-07 3 views
0

Bitte lesen Sie diesen Checkbox Stil:Checkbox Stil Vordergrundfarbe ändert sich nicht, obwohl Stil definded

<Style TargetType="{x:Type CheckBox}"> 
    <Setter Property="SnapsToDevicePixels" Value="true" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="Height" Value="20" /> 
    <Setter Property="FocusVisualStyle" Value="{DynamicResource MyFocusVisualStyte}" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type CheckBox}"> 
       <BulletDecorator> 
        <BulletDecorator.Bullet> 
         <Grid Height="{TemplateBinding Height}" 
            Width="{Binding RelativeSource={RelativeSource Self}, Path=Height, UpdateSourceTrigger=PropertyChanged}" 
            MinHeight="20" 
            MinWidth="20" 
            ShowGridLines="False"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="4*" /> 
           <ColumnDefinition Width="1*" /> 
           <ColumnDefinition Width="1*" /> 
           <ColumnDefinition Width="4*" /> 
           <ColumnDefinition Width="1*" /> 
           <ColumnDefinition Width="1*" /> 
           <ColumnDefinition Width="2*" /> 
           <ColumnDefinition Width="2*" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="3*" /> 
           <RowDefinition Height="1*" /> 
           <RowDefinition Height="1*" /> 
           <RowDefinition Height="1*" /> 
           <RowDefinition Height="4*" /> 
           <RowDefinition Height="1*" /> 
           <RowDefinition Height="1*" /> 
           <RowDefinition Height="4*" /> 
          </Grid.RowDefinitions> 
          <Border 
           Name="MainBorder" 
           Grid.ColumnSpan="9" 
           Grid.RowSpan="9" 
           CornerRadius="4" 
           BorderThickness="1" 
           Background="Transparent" /> 
          <Border 
           Name="InnerBorder" 
           Grid.Column="1" 
           Grid.ColumnSpan="5" 
           Grid.Row="2" 
           Grid.RowSpan="5" 
           BorderThickness="1" 
           BorderBrush="Gray" /> 
          <Path 
           Name="InnerPath" 
           Grid.Column="1" 
           Grid.ColumnSpan="5" 
           Grid.Row="2" 
           Grid.RowSpan="5" 
           Data="M31,5 L19.5,5 19.5,19.5 34.5,19.5 34.5,11.75" 
           Stretch="Fill" 
           Stroke="Gray"/> 
          <Path 
           Name="CheckMark" 
           Grid.Column="2" 
           Grid.ColumnSpan="5" 
           Grid.Row="1" 
           Grid.RowSpan="5" 
           Opacity="0" 
           Data="M9.07743946676476E-09,4.31805768640244L4.68740335877841,8.86361158398516C4.68740335877841,8.86361158398516,16.3281249985376,-2.42451336648723,16.3281249985376,-2.42451336648723L14.0622100581796,-4.77304938341948 4.68740335877846,4.31805791992662 2.22656251699567,1.93164208562579z" 
           Fill="Orange" 
           Stretch="Fill" 
           Stroke="Orange" /> 
          <Path 
           Name="InderminateMark" 
           Grid.Column="3" 
           Grid.Row="4" 
           Data="M0,4 L1,5 5,1 4,0" 
           Opacity="0" 
           Stretch="Fill" 
           StrokeThickness="0" 
           Fill="#808080" /> 
         </Grid> 
        </BulletDecorator.Bullet> 
        <VisualStateManager.VisualStateGroups> 
         <VisualStateGroup x:Name="CheckStates"> 
          <VisualState x:Name="Checked"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Opacity" 
             Storyboard.TargetName="CheckMark" Duration="0:0:0.2" To="1" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Unchecked" > 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Opacity" 
             Storyboard.TargetName="CheckMark" Duration="0:0:0.2" To="0" /> 
           </Storyboard> 
          </VisualState> 
          <VisualState x:Name="Indeterminate"> 
           <Storyboard> 
            <DoubleAnimation Storyboard.TargetProperty="Opacity" 
             Storyboard.TargetName="InderminateMark" Duration="0:0:0.2" To="1" /> 
           </Storyboard> 
          </VisualState> 
         </VisualStateGroup> 
        </VisualStateManager.VisualStateGroups> 
        <ContentPresenter 
          Margin="4,0,4,0" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Left" 
          RecognizesAccessKey="True" /> 
       </BulletDecorator> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#FF7AA0CD" /> 
         <Setter TargetName="InnerPath" Property="Stroke" Value="#FF7AA0CD" /> 
         <Setter TargetName="CheckMark" Property="Fill" Value="Gainsboro"/> 
         <Setter TargetName="CheckMark" Property="Stroke" Value="Gainsboro"/> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="True"> 
         <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" /> 
         <Setter Property="Foreground" Value="#303030"/> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="False"> 
         <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" />        
        </Trigger> 
        <Trigger Property="IsPressed" Value="True"> 
         <Setter TargetName="MainBorder" Property="Background" Value="#81d2eb" /> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="True"> 
         <Setter Property="Foreground" Value="Gainsboro"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Foreground" Value="#55B3B3B6"/> 
         <Setter TargetName="CheckMark" Property="Fill" Value="Orange" /> 
         <Setter TargetName="CheckMark" Property="Stroke" Value="Orange" /> 
         <Setter TargetName="InnerPath" Property="Stroke" Value="#55649EB4" /> 
         <Setter TargetName="InderminateMark" Property="Fill" Value="#cccccc" /> 
         <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#55649EB4" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Also versuche ich, sehr einfach hinzufügen style für ForegroundColor wenn mein Checkbox wird geprüft:

<Trigger Property="IsChecked" Value="True"> 
    <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" /> 
    <Setter Property="Foreground" Value="#303030"/> 
</Trigger> 

Und Aus irgendeinem Grund funktioniert das nicht und Foreground Farbe ändert sich nicht. Irgendein Vorschlag warum?

aktualisieren

Das ist mein Checkbox:

<CheckBox 
    FontSize="14" 
    Height="25" 
    FontFamily="Ariel"/> 

Wie Sie i gesetzt bin nicht hier Foreground Eigenschaft sehen.

+0

Sind Sie 'Foreground' in einem Attribut zu setzen. direkt auf das CheckBox-Element selbst? Das überschreibt alles, was der Stil in einem Setter tut, aufgrund des Vorrangs der Abhängigkeitseigenschaftswerte. Ein weiterer Punkt ist, dass ich {TemplateBinding Foreground} in Ihrer Vorlage nicht sehe. Wenn Sie den Wert von "CheckBox.Foreground" in Ihrer Vorlage nicht * verwenden, hat die Einstellung keinen sichtbaren Effekt. –

+0

Nein, bitte sehen Sie mein Update – user979033

+0

Vielen Dank. In diesem Fall würde ich nach 'TextElement.Foreground =" {TemplateBinding Foreground} "auf Ihrem ContentPresenter suchen. –

Antwort

1

Hier ist die Reihenfolge einiger Ihrer Trigger: (i. Ihr "Wenn diese Option aktiviert" Vordergrund Rot für Offensichtlichkeit geändert)

<Trigger Property="IsChecked" Value="True"> 
    <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" /> 
    <Setter Property="Foreground" Value="Red"/> 
</Trigger> 
<Trigger Property="IsChecked" Value="False"> 
    <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" /> 
</Trigger> 
<Trigger Property="IsPressed" Value="True"> 
    <Setter TargetName="MainBorder" Property="Background" Value="#81d2eb" /> 
</Trigger> 
<Trigger Property="IsEnabled" Value="True"> 
    <Setter Property="Foreground" Value="Gainsboro"/> 
</Trigger> 

  1. Wenn es aktiviert ist, machen den Vordergrund Red (oder # 303030 in deinem Fall).

  2. Dann, wenn es nicht überprüft wird, InnerBorder zusammenfalten.

  3. Dann, wenn es gedrückt wird, den MainBorder Hintergrund einstellen.

  4. Schließlich, wenn es aktiviert ist, setzen Sie Vordergrund auf Gainsboro.

So , wenn es aktiviert ist, setzt sie den Vordergrund Gainsboro.

Sie überschreiben den IsChecked-Vordergrund. Einfach fix, haben gedacht, dass du es schon aus:

<Trigger Property="IsChecked" Value="False"> 
    <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" /> 
</Trigger> 
<Trigger Property="IsPressed" Value="True"> 
    <Setter TargetName="MainBorder" Property="Background" Value="#81d2eb" /> 
</Trigger> 
<Trigger Property="IsEnabled" Value="True"> 
    <Setter Property="Foreground" Value="Gainsboro"/> 
</Trigger> 
<!-- 
Move this one so it comes after IsEnabled="True", but before IsEnabled="False" 
--> 
<Trigger Property="IsChecked" Value="True"> 
    <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" /> 
    <Setter Property="Foreground" Value="Red"/> 
</Trigger> 

Sie brauchen nicht explizit Foreground auf die ContentPresenter anzuwenden, das war der Senilität in kicking

+0

Warum diese Reihenfolge so wichtig? – user979033

+0

@ user979033 Stellen Sie sich die Trigger so vor, dass sie in der Reihenfolge von Anfang bis Ende angewendet werden. Dies geschieht per Entwurf: Sie können auswählen, welche Trigger die anderen Trigger überschreiben. Wenn Sie 'IsEnabled =" False "' zuletzt setzen, überschreibt es alles andere. So können Sie den Vordergrund grau machen, wenn er deaktiviert ist, selbst wenn er überprüft wird. –

+0

Ein weiteres Problem hier ist IsChecked = Fasle, ich versuche immer noch, Vordergrundfarbe, aber keine Änderung hier (dieser Auslöser ist der erste) – user979033