2016-03-23 24 views
0

我开始说这个问题的原因是我没有太多使用WPF的经验,因为我刚刚开始使用它(我之前的所有C#经验都是使用Windows Forms和ASP.net )。WPF可以被其他样式继承的泛型

比方说,我在我的App.xaml,一个定义了一个蓝色按钮和一个定义了红色按钮定义的两种风格:

<Style x:Key="BlueButton" TargetType="Button"> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FF50D0FF"/> 
       <GradientStop Color="#FF0092C8" Offset="1"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border CornerRadius="2" Background="{TemplateBinding Background}"> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FF0092C8"/> 
         <GradientStop Color="#FF50D0FF" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
<Style x:Key="RedButton" TargetType="Button"> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FFFFAE00" Offset="0"/> 
       <GradientStop Color="Red" Offset="1"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border CornerRadius="2" Background="{TemplateBinding Background}"> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="Red" Offset="0"/> 
         <GradientStop Color="#FFFFAE00" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

我怎么能合并这两种风格做一般性“包含两者”的风格?

编辑:

德米特里Polyanskiy的答案的作品,但我还是要我想创建一个新的风格,每次设置的每种属性。有没有办法做这样的事情:<Style x:Key="RedButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}" Color1="#FFFFAE00" Color2="Red" />

<Style x:Key="RedButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}"> 
    <Setter Property="Color1" Value="#FFFFAE00" /> 
    <Setter Property="Color2" Value="Red" /> 
</Style> 

然后自动设定的两个渐变颜色?

+0

你的意思是通过合并两个风格?你怎么能有一个蓝色和红色的按钮? – Nitin

+0

我的意思是像一般风格的东西,所以如果我想添加一个绿色的按钮,我可以做到这一点,而无需再次写一切。 – user3807877

+0

我认为您正在寻找['BasedOn'](https://msdn.microsoft.com/en-us/library/system.windows.style.basedon%28v=vs.110%29.aspx) – Default

回答

2

基本上,你想创建基于'参数化'风格的样式。

您需要做的是使用DynamicResources为GradientStop的颜色创建基本样式。然后,在基于它的样式中,覆盖资源颜色。

BaseButtonStyle:

<Style x:Key="BaseButtonStyle" TargetType="Button"> 
    <Style.Resources> 
     <Color x:Key="Color1">White</Color> 
     <Color x:Key="Color2">Gray</Color> 
    </Style.Resources> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="{DynamicResource Color1}"/> 
       <GradientStop Color="{DynamicResource Color2}" Offset="1"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border CornerRadius="2" Background="{TemplateBinding Background}"> 
        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="{DynamicResource Color2}" /> 
         <GradientStop Color="{DynamicResource Color1}" Offset="1" /> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

支持算法FMP样式:

<Style x:Key="RedButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}"> 
    <Style.Resources> 
     <Color x:Key="Color1">#FFFFAE00</Color> 
     <Color x:Key="Color2">Red</Color> 
    </Style.Resources> 
</Style> 
<Style x:Key="BlueButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}"> 
    <Style.Resources> 
     <Color x:Key="Color1">#FF50D0FF</Color> 
     <Color x:Key="Color2">#FF0092C8</Color> 
    </Style.Resources> 
</Style> 
<Style x:Key="GreenButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}"> 
    <Style.Resources> 
     <Color x:Key="Color1">Green</Color> 
     <Color x:Key="Color2">LightGreen</Color> 
    </Style.Resources> 
</Style> 
<Style x:Key="PurpleYellowButton" TargetType="Button" BasedOn="{StaticResource BaseButtonStyle}"> 
    <Style.Resources> 
     <Color x:Key="Color1">Purple</Color> 
     <Color x:Key="Color2">Yellow</Color> 
    </Style.Resources> 
</Style> 

按钮的StackPanel中的截图: enter image description here

0

我刚刚创建了一个快速示例,向您展示如何做到这一点。您应该描述具有共同属性的基础样式。 ,然后只用BaseOn = {StaticResource的BaseStyle}实现这一目标的

<Style x:Key="BaseButtonStyle" TargetType="Button"> 
    <Setter Property="Foreground" Value="White" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border 
        CornerRadius="2" 
        Background="{TemplateBinding Background}"> 
        <ContentPresenter 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 


<Style x:Key="RedButton" TargetType="Button" 
     BasedOn="{StaticResource BaseButtonStyle}"> 
    <Setter Property="Background"> 
     <Setter.Value> 
      <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
       <GradientStop Color="#FFFFAE00" Offset="0"/> 
       <GradientStop Color="Red" Offset="1"/> 
      </LinearGradientBrush> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsPressed" Value="True"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="Red" Offset="0"/> 
         <GradientStop Color="#FFFFAE00" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 
</Style> 
0

的一种方法是定义一个风格,而不是在风格本身给渐变您可以使用DynamicResource像下面。然后对于每个按钮,您可以定义要使用的本地资源LinearGradientBrush并在其中设置颜色。

<Window x:Class="" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <Style x:Key="BaseButtonStyle" TargetType="Button"> 
      <Setter Property="Foreground" Value="White" /> 
      <Setter Property="Background" Value="{DynamicResource GradientBrushNormal}"> 
      </Setter> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type Button}"> 
         <Border CornerRadius="2" Background="{TemplateBinding Background}"> 
          <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center"/> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
      <Style.Triggers> 
       <Trigger Property="IsPressed" Value="True"> 
        <Setter Property="Background" Value="{DynamicResource GradientBrushPressed}"> 
        </Setter> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Window.Resources> 
    <StackPanel> 
     <Button Style="{StaticResource BaseButtonStyle}" Content="Blue Button"> 
      <Button.Resources> 
       <LinearGradientBrush x:Key="GradientBrushPressed" EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="#FF0092C8"/> 
        <GradientStop Color="#FF50D0FF" Offset="1"/> 
       </LinearGradientBrush> 
       <LinearGradientBrush x:Key="GradientBrushNormal" EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="#FF50D0FF"/> 
        <GradientStop Color="#FF0092C8" Offset="1"/> 
       </LinearGradientBrush> 
      </Button.Resources> 
     </Button> 
     <Button Style="{StaticResource BaseButtonStyle}" Content="Red Button"> 
      <Button.Resources> 
       <LinearGradientBrush x:Key="GradientBrushPressed" EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="Red" Offset="0"/> 
        <GradientStop Color="#FFFFAE00" Offset="1"/> 
       </LinearGradientBrush> 
       <LinearGradientBrush x:Key="GradientBrushNormal" EndPoint="0.5,1" StartPoint="0.5,0"> 
        <GradientStop Color="#FFFFAE00" Offset="0"/> 
        <GradientStop Color="Red" Offset="1"/> 
       </LinearGradientBrush> 
      </Button.Resources> 
     </Button> 
    </StackPanel> 
</Window>