2

我创建了一种样式,它定义了控件的通用外观。这包括一个RadialGradientBrush, 和一个带有圆角半径的边框。

我将此样式应用于我想要看起来像这样的相关边框控件。

在样式中,我为 指定了 3 种颜色RadialGradientBrush,但是,我希望能够使指定的颜色中的一种从实际的边框控件中拾取颜色。

<Style x:Key='ButtonStyle' TargetType='Border'>
    <Setter Property='CornerRadius' Value='10' />
    <Setter Property='Margin' Value='2' />
    <Setter Property='BorderThickness' Value='1'/>
    <Setter Property='BorderBrush' Value='White'/>
    <Setter Property='Background'>
        <Setter.Value>
            <RadialGradientBrush >
                <GradientStop Color='DarkBlue' Offset='0.9'/>
                <GradientStop Color='White' Offset='0.7'/>
                <GradientStop Color='Black' Offset='0.3' />
            </RadialGradientBrush>
        </Setter.Value>
    </Setter>
</Style>

因此,在 <Style> 中显示 DarkBlue 的地方,我希望说类似. 然后它将使用实际控件中定义的背景颜色来替换该值。Control.Backcolor

希望这是有道理的。谢谢里奇。

4

1 回答 1

1

你可以这样解决它:

    <Grid>
    <Grid.Resources>
      <local:ColorConverter x:Key="myColorConverter"/>
      <Style x:Key="ButtonStyle" TargetType="{x:Type Border}">
        <Setter Property="CornerRadius" Value="10" />
        <Setter Property="Margin" Value="2" />
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="Background">
          <Setter.Value>
            <RadialGradientBrush >
              <GradientStop Color="{Binding Path=BorderBrush,Converter={StaticResource myColorConverter}, RelativeSource={RelativeSource AncestorType={x:Type Border}}}" Offset="0.9" />
              <GradientStop Color='White' Offset='0.7'/>
              <GradientStop Color='Black' Offset='0.3' />
                     </RadialGradientBrush>
          </Setter.Value>
        </Setter>
      </Style>

    </Grid.Resources>
      <StackPanel x:Name="myStackPanel">
        <Border x:Name="myBorder1" Style="{StaticResource ButtonStyle}" BorderBrush="Yellow" Height="25"></Border>
        <Border x:Name="myBorder2" Style="{StaticResource ButtonStyle}" BorderBrush="Green" Height="25"></Border>
      </StackPanel>
  </Grid>

你需要一个转换器来访问画笔的颜色。

  public class ColorConverter : IValueConverter
  {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      if (value is SolidColorBrush)
      {
        var brush = value as SolidColorBrush;
        return brush.Color;
      }
      return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
      throw new NotImplementedException();
    }
  }

在此示例中,我使用边框的 BorderBrush 作为 RadialGradientBrush 的最外层颜色。您不能在此处使用 Background 属性,因为它会覆盖样式设置的值。更清洁的解决方案是派生您自己的 Border 并为您不同的颜色值创建 DependencyProperties ...

于 2012-05-29T15:42:36.210 回答