2012-10-26 70 views
1

我已经创建了自定义控件,因此如果出现错误,只需将geroupbox的边框绘制为红色即可。由于某种原因,当我使用控件前景色不能正确设置时,它默认为白色而不是绿色。我的代码如下:WPF GroupBox风格不适用于自定义控件

public class ErrorGroupBox : GroupBox 
{ 
    static ErrorGroupBox() 
    { 
    } 

    public bool ErrorState 
    { 
     get { return (bool)GetValue(ErrorStateProperty); } 
     set { base.SetValue(ErrorStateProperty, value); } 
    } 

    public static readonly DependencyProperty ErrorStateProperty = 
     DependencyProperty.Register("ErrorState", typeof(bool), typeof(ErrorGroupBox), new UIPropertyMetadata(false)); 
} 

的风格是:

<Style x:Name="ErrorGroupBox" TargetType="local:ErrorGroupBox"> 
    <Setter Property="Foreground" Value="Green"/> 
    <Setter Property="BorderThickness" Value="2"/> 
    <Setter Property="FontFamily" Value="Tahoma"/> 
    <Setter Property="FontSize" Value="13"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="GroupBox"> 
       <Grid SnapsToDevicePixels="True" Margin="5"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="6"/> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="6"/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="Auto"/> 
         <RowDefinition Height="*"/> 
         <RowDefinition Height="6"/> 
        </Grid.RowDefinitions> 

        <!--<Border Background="{TemplateBinding Background}" BorderBrush="Transparent" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         CornerRadius="4" Grid.Column="1 " Grid.ColumnSpan="4" 
         Grid.Row="1" Grid.RowSpan="3" HorizontalAlignment="Stretch"/>--> 

        <!--The Title--> 
        <Border x:Name="Header" Grid.Column="2" Grid.RowSpan="2" HorizontalAlignment="Left" 
         Padding="3,1,3,0" VerticalAlignment="Stretch" > 
         <Border.Effect> 
          <DropShadowEffect BlurRadius="5" Direction="334"/> 
         </Border.Effect> 

         <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
          Content="{TemplateBinding Header}" 
          ContentSource="Header" 
          ContentStringFormat="{TemplateBinding HeaderStringFormat}" 
          ContentTemplate="{TemplateBinding HeaderTemplate}" 
          RecognizesAccessKey="True" Height="Auto" 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center" 
          OpacityMask="#FF3844BD" Margin="0,1,0,0"> 
         </ContentPresenter> 
        </Border> 

        <ContentPresenter Margin="5" 
    SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
    Content="{TemplateBinding Content}" 
    ContentStringFormat="{TemplateBinding ContentStringFormat}" 
    ContentTemplate="{TemplateBinding ContentTemplate}" 
    Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2" /> 
        <Border BorderBrush="#BFBFBF" BorderThickness="{TemplateBinding BorderThickness}" 
         CornerRadius="4" Grid.ColumnSpan="3" Grid.Row="1" Grid.RowSpan="3" RenderTransformOrigin="0.5,0.5" Margin="0"> 
         <Border.OpacityMask> 
          <MultiBinding ConverterParameter="7" UpdateSourceTrigger="Default"> 
           <MultiBinding.Converter> 
            <BorderGapMaskConverter/> 
           </MultiBinding.Converter> 
           <Binding Path="ActualWidth" ElementName="Header"/> 
           <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/> 
           <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/> 
          </MultiBinding> 
         </Border.OpacityMask> 
        </Border> 
       </Grid> 
       <ControlTemplate.Triggers>      
        <Trigger Property="local:ErrorGroupBox.ErrorState" Value="True"> 
         <Setter Property="Foreground" Value="Green"/> 
        </Trigger> 
        <Trigger Property="local:ErrorGroupBox.ErrorState" Value="False"> 
         <Setter Property="Foreground" Value="Green"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我使用控制如下:

<controls:ErrorGroupBox ErrorState="{Binding Error}" Header="Test Type" Margin="20,20,0,0" Name="groupBox1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="226" Grid.Column="0"> 
+0

你的风格对我来说工作得很好。也许使用[Snoop](http://snoopwpf.codeplex.com/)这样的东西来看看你的视觉树上发生了什么 – Rachel

+0

@Rachel谢谢你的尝试,你的标题显示为绿色吗?我无法弄清楚发生了什么事。 – user1145533

+0

是的,我复制并粘贴了你在这里发布的所有3位代码,它对我来说工作得很好。此控件是否具有选择功能的其他控件(如ListBox)?或者你在某处覆盖默认的样式或系统颜色? – Rachel

回答

0

如果这是一个默认的主题风格,你需要指定一个静态构造函数中的不同元数据类型:

public class ErrorGroupBox : GroupBox 
{ 
    static ErrorGroupBox() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ErrorGroupBox), new FrameworkPropertyMetadata(typeof(ErrorGroupBox))); 
    }