2016-03-07 96 views
1

是否可以在不编辑元素的情况下将样式添加到xaml元素wpf为指定元素创建样式

例如:

XAML元素:

<Grid> 
    <Grid x:Name="A">content A</Grid> 
    <Grid x:Name="B">content B</Grid> 
</Grid> 

和风格:

<Style x:Key="StyleForA" TargetName="A" TargetType="{x:Type Grid}" > 
    <Setter Property="Background" Value="Red"/> 
</Style> 
<Style x:Key="StyleForB" TargetName="B" TargetType="{x:Type Grid}" > 
    <Setter Property="Background" Value="Green"/> 
</Style> 

UPD: 我有很多的样式(航空,黑色等)项目。

如果我编辑元素Style="{StaticResources StyleForA}"我必须编辑所有样式。 所以我需要创建影响到指定元素的本地风格。

+1

您可以利用样式继承(见['BasedOn'(http://www.wpftutorial.net/StyleInheritance.html))或默认样式* “传播” *('TargetType'没有'X: Key'将把样式应用于该类型的所有子元素)。 – Sinatr

+0

在我写第一个答案时使用BasedOn。 –

回答

0

是的。我用这种风格对我的App.xaml添加teplate各地的aplication控制与错误:

<Style x:Key="BordaTemplate" TargetType="Control"> 
     <Setter Property="Validation.ErrorTemplate"> 
      <Setter.Value> 
       <ControlTemplate> 
        <DockPanel LastChildFill="True">       
         <Border BorderBrush="Red" BorderThickness="1">       
          <AdornedElementPlaceholder Name="myControl"/> 
         </Border> 
        </DockPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
        Path=(Validation.Errors).CurrentItem.ErrorContent}"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 


<Style TargetType="TextBox" BasedOn="{StaticResource BordaTemplate}" />   
     <Style TargetType="PasswordBox" BasedOn="{StaticResource BordaTemplate}" /> 
     <Style TargetType="DataGrid" BasedOn="{StaticResource BordaTemplate}" /> 
     <Style TargetType="ListBox" BasedOn="{StaticResource BordaTemplate}" /> 
    <Style TargetType="CheckBox" BasedOn="{StaticResource BordaTemplate}" /> 
    <Style TargetType="ComboBox" BasedOn="{StaticResource BordaTemplate}" /> 
    <Style TargetType="DatePicker" BasedOn="{StaticResource BordaTemplate}" /> 
0

不喜欢,你已经使用target定义,但如果你想一个style适用于特定的control。然后输入如下:

<StackPanel> 
     <Button x:Name="A"> 
      <Button.Resources> 
       <Style TargetType="{x:Type Button}" > 
        <Setter Property="Background" Value="Red"/> 
       </Style> 
      </Button.Resources> 
      content A</Button> 
     <Button x:Name="B"> 
      <Button.Resources> 
       <Style TargetType="{x:Type Button}" > 
        <Setter Property="Background" Value="Green"/> 
       </Style> 
      </Button.Resources> 
      content B</Button> 
    </StackPanel> 

或者可能创建一个基本的风格,然后创建一个BasedOn风格为您的控件。

更新:如果你只是想关心在时间的风格和一定影响的元素:

<Window.Resources> 
    <Style TargetType="{x:Type Button}" x:Key="First" > 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
    <Style TargetType="{x:Type Button}" x:Key="Second" > 
     <Setter Property="Background" Value="Green"/> 
    </Style> 
</Window.Resources> 
<StackPanel> 
    <Button x:Name="A"> 
     <Button.Resources> 
      <Style TargetType="{x:Type Button}" BasedOn="{StaticResource First}" />     
     </Button.Resources> 
     content A</Button> 
    <Button x:Name="B"> 
     <Button.Resources> 
      <Style TargetType="{x:Type Button}" BasedOn="{StaticResource Second}" />      
     </Button.Resources> 
     content B</Button> 
</StackPanel> 
+0

我想获得答案:可以不编辑元素? –

+0

我不确定编辑元素是什么意思?你能详细说明吗? –

+0

@Dr_klo为您的观点,在答案中添加更新。 –

0

本身,你不能。

但不接触你的XAML,你可以做到这一点很容易使用代码:使用Blend behaviors

Grd1.Style = (Style) this.Resources["GridKey"]; 

纯XAML的做法,

<Grid x:Name="Grd1"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Loaded"> 
      <ic:ChangePropertyAction PropertyName="Style" Value="{DynamicResource GridKey}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Grid> 
0

我想你可以有一个默认的样式,你可以在您的本地风格上覆盖您想要的属性。

<Grid> 
     <Grid.Resources> 
      <Style TargetType="Button" x:Key="Default"> 
       <Setter Property="Background" Value="White"></Setter> 
       <Setter Property="Foreground" Value="Blue"/> 
      </Style> 

      <Style x:Key="StyleForA" BasedOn="{StaticResource Default}" TargetType="Button" > 
       <Setter Property="Background" Value="Red" ></Setter> 
      </Style> 

      <Style x:Key="StyleForB" BasedOn="{StaticResource Default}" TargetType="Button" > 
       <Setter Property="Background" Value="Green" ></Setter> 
      </Style> 
     </Grid.Resources> 
     <StackPanel> 
      <Button Style="{StaticResource StyleForA}" Width="100" x:Name="A" Click="Button_Click" Height="100">Test A</Button> 
      <Button Style="{StaticResource StyleForB}" Width="100" x:Name="B" Click="Button_Click" Height="100">Test B</Button> 
     </StackPanel> 
    </Grid>