wpf为命名元素创建样式

时间:2016-03-07 11:42:46

标签: c# wpf xaml

是否可以在不编辑元素的情况下为xaml元素添加样式?

例如:

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}",我必须编辑所有样式。 所以我需要创建一个影响命名元素的本地样式。

4 个答案:

答案 0 :(得分:1)

原则上你不能。

但是,如果不触及您的XAML,您可以使用代码轻松完成:

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

使用Blend behaviors

的纯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>

答案 1 :(得分:0)

是。我在App.xaml上使用这种样式,在所有应用程序控件周围添加了一个错误:

<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}" />   

答案 2 :(得分:0)

不像您使用 $stateProvider.state("home", { url: "", controller: "HomeCtrl", templateUrl: "/static/development/templates/home.html" }) 定义的那样,但是如果您想将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

答案 3 :(得分: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>