2015-09-04 60 views
0

我在XAML一個複選框爲:如何觸發Validation.HasError來更改複選框背景顏色?

<Style TargetType="{x:Type CheckBox}"> 
     <Setter Property="Height" Value="14" /> 
     <Setter Property="FontSize" Value="12" /> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="True"> 
       <Setter Property="Background" Value="Red"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 


<CheckBox Content="Cash Only" 
       HorizontalAlignment="Left" Margin="158,0,0,264" VerticalAlignment="Bottom" Width="83" IsThreeState="True" > 
     <CheckBox.IsChecked> 
      <Binding Path="ServiceBilling.CashOnly"> 
       <Binding.ValidationRules> 
        <h:Not_Null_Rule ValidatesOnTargetUpdated="True"/> 
       </Binding.ValidationRules> 
      </Binding> 
     </CheckBox.IsChecked> 
    </CheckBox> 

如果該複選框物業器isChecked爲null,真實,否則Not_Null_Rule正確返回false。

但是,如果爲null,則複選框在框內顯示灰色複選標記。該框具有紅色邊框,但未填充紅色。

我在做什麼錯?我希望盒子在爲空時填充紅色。

TIA

回答

0

對任何感興趣的人來說,這個新手的問​​題的答案是更多的參與,然後它會首先出現。

  1. 在研究複選框樣式時,沒有依賴項屬性包含在BulletDecorator中的邊框背景。因此,實現它的唯一方法是@MohitShrivastava建議並使用OverridesDefaultStyle替換默認樣式。 See Customizing the Checkbox
  2. 看來驗證最終歸結爲一個AdornedElementPlaceholder,其中AFAIK不公開所持有的元素的任何特性。 See How to apply style to an adorned element

所以,代替更好的主意,這裏是我的工作代碼。歡迎提供更好的建議。

<ControlTemplate x:Key="validationTemplate"> 
      <DockPanel LastChildFill="True"> 
       <TextBlock DockPanel.Dock="Right" Foreground="Red" FontSize="12pt">!!!</TextBlock> 
       <TextBlock DockPanel.Dock="Left" Foreground="Red" FontSize="12pt">!!!</TextBlock> 
       <Border BorderBrush="Red" BorderThickness="1"> 
        <AdornedElementPlaceholder/> 
       </Border> 
      </DockPanel> 
     </ControlTemplate> 

<CheckBox 
      Content="Cash Only" HorizontalAlignment="Left" Margin="202,0,0,264" VerticalAlignment="Bottom" 
      Width="108" FontSize="16" 
      Style="{StaticResource WarningCheckbox}" Validation.ErrorTemplate="{DynamicResource validationTemplate}" 
      > 
      <CheckBox.IsChecked> 
       <Binding Path="ServiceBilling.CashOnly" UpdateSourceTrigger="PropertyChanged"> 
        <Binding.ValidationRules> 
         <h:Not_Null_Rule ValidatesOnTargetUpdated="True"/> 
        </Binding.ValidationRules> 
       </Binding> 
      </CheckBox.IsChecked> 

     </CheckBox> 

<!--Warning CheckBox to show Red when null--> 
    <Style x:Key="WarningCheckbox" TargetType="CheckBox"> 
    <Setter Property="SnapsToDevicePixels" Value="False" /> 
    <Setter Property="OverridesDefaultStyle" Value="true" /> 
    <Setter Property="FocusVisualStyle"  Value="{x:Null}" /> 
    <Setter Property="BorderBrush"   Value="Black" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="CheckBox"> 
      <BulletDecorator Background="Transparent"> 
      <BulletDecorator.Bullet> 
       <Border x:Name="Border" 
         Width="18" 
         Height="18" 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="1" 
         ClipToBounds="True"> 
       <Border.Effect> 
        <DropShadowEffect BlurRadius="5" ShadowDepth="2" /> 
       </Border.Effect> 
       <Path x:Name="CheckMark" 
         Width="18" 
         Height="18" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Data="M 0 0 L 8 8 M 0 8 L 8 0" 
         Stretch="Fill" 
         Stroke="Black" 
         StrokeEndLineCap="Round" 
         StrokeStartLineCap="Round" 
         StrokeThickness="2" /> 
       </Border> 
      </BulletDecorator.Bullet> 
       <ContentPresenter Margin="4,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" RecognizesAccessKey="True" /> 
      </BulletDecorator> 
      <ControlTemplate.Triggers> 
      <Trigger Property="IsChecked" Value="{x:Null}"> 
        <Setter TargetName="CheckMark" Property="Stroke" Value="Red" /> 
        <Setter TargetName="Border" Property="Background" Value="Red" /> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="false"> 
       <Setter TargetName="CheckMark" Property="Visibility" Value="Hidden" /> 
       <Setter TargetName="Border" Property="Background" Value="White" /> 
      </Trigger> 
      <Trigger Property="IsChecked" Value="true"> 
       <Setter TargetName="CheckMark" Property="Stroke" Value="Black" /> 
       <Setter TargetName="CheckMark" Property="Visibility" Value="Visible" /> 
       <Setter TargetName="Border" Property="Background" Value="White" /> 
      </Trigger> 

      <!-- 
      <Trigger Property="IsFocused" Value="true"> 
       <Setter Property="BorderBrush" Value="White" /> 
      </Trigger>--> 
      <Trigger Property="IsEnabled" Value="false"> 
       <Setter Property="BorderBrush" Value="Gray" /> 
       <Setter TargetName="CheckMark" Property="Stroke" Value="Gray" /> 
      </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
1

你可以用這種風格來完成任務

你需要根據你的需要

<Style TargetType="CheckBox" x:Key="CircleCheckbox"> 
     <Setter Property="Cursor" Value="Hand"></Setter> 
     <Setter Property="Content" Value=""></Setter> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type CheckBox}">     
        <Grid>      
         <Ellipse x:Name="outerEllipse"> 
          <Ellipse.Fill> 
           <RadialGradientBrush> 
            <GradientStop Offset="0" Color="Red"/> 
            <GradientStop Offset="0.88" Color="LightCoral"/> 
            <GradientStop Offset="1" Color="DarkRed"/> 
           </RadialGradientBrush> 
          </Ellipse.Fill> 
         </Ellipse> 
         <Ellipse Margin="10" x:Name="highlightCircle" > 
          <Ellipse.Fill > 
           <LinearGradientBrush > 
            <GradientStop Offset="0" Color="Green"/> 
            <GradientStop Offset="0.5" Color="LightGreen"/> 
            <GradientStop Offset="1" Color="DarkGreen"/> 
           </LinearGradientBrush> 
          </Ellipse.Fill> 
         </Ellipse> 
         <ContentPresenter x:Name="content" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsChecked" Value="True"> 
          <Setter TargetName="highlightCircle" Property="Fill"> 
           <Setter.Value> 
            <LinearGradientBrush StartPoint="0.3,0" EndPoint="0.7,1"> 
             <GradientStop Offset="0" Color="Green"/> 
             <GradientStop Offset="0.5" Color="LightGreen"/> 
             <GradientStop Offset="1" Color="DarkGreen"/> 
            </LinearGradientBrush> 
           </Setter.Value> 
          </Setter> 
          <Setter TargetName="outerEllipse" Property="Fill"> 
           <Setter.Value> 
            <RadialGradientBrush> 
             <GradientStop Offset="0" Color="Green"/> 
             <GradientStop Offset="0.88" Color="LightGreen"/> 
             <GradientStop Offset="1" Color="DarkGreen"/> 
            </RadialGradientBrush> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
         <Trigger Property="IsChecked" Value="False"> 
          <Setter TargetName="highlightCircle" Property="Fill"> 
           <Setter.Value> 
            <LinearGradientBrush StartPoint="0.3,0" EndPoint="0.7,1"> 
             <GradientStop Offset="0" Color="Red"/> 
             <GradientStop Offset="0.5" Color="LightCoral"/> 
             <GradientStop Offset="1" Color="DarkRed"/> 
            </LinearGradientBrush> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

改變顏色也可以對Default Template of CheckBox看看得到更好的想法你想用複選框做什麼

+0

所以我需要重拍整個控制模板設置觸發器????這似乎很廣泛:(謝謝。 –

+0

無論如何在我的開篇子句中使用Validation.HasError? –

+0

Lemme請參閱@AlanWayne –