为什么WPF样式应用于父控件?

时间:2011-02-10 11:52:19

标签: wpf silverlight xaml

我定义了一个自定义WPF样式。我想网格中的任何按钮都是红色的。但如果我定义这种风格,整个网格是红色的 !!为什么?我明确定义了Button.Background。

<Window x:Class="WpfApplication2.MainWindow"
        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="MyStyle">
            <Setter Property="Button.Background" Value="Red" /> <!-- Only inner buttons -->
        </Style>            
    </Window.Resources>

    <Grid Style="{StaticResource MyStyle}">
        <Button Content="Go" Margin="29,36,385,239" />
    </Grid>
</Window>

3 个答案:

答案 0 :(得分:1)

为了实现您的目标,我认为您必须在Style内定义内部Style.Resources。这将使Button中的所有Grid选择“内部”Style,除非他们明确使用其他Style

<Window.Resources>
    <Style x:Key="MyStyle">
        <Style.Resources>
            <!-- Only inner buttons -->
            <Style TargetType="Button">
                <Setter Property="Background" Value="Red" />
            </Style>
        </Style.Resources>
    </Style>
</Window.Resources>
<Grid Style="{StaticResource MyStyle}">
    <Button Content="Go" Margin="29,36,385,239" />
</Grid>

由于Button.Background不是附加属性(与TextBlock.Foreground不同),Background将不会应用于Button Grid }。

但至于“为什么Grid拿起Background”我无法告诉你。这对我来说似乎是个错误。 Button背景继承自ControlGrid背景继承自Panel,所以目前为止我可以看到,Grid不应该使用该值,但我可能会遗漏某些内容

另外,如果您尝试直接在Button.Background

上设置Grid,则会出现以下错误
  

错误MC3015:附加属性   'Button.Background'未定义   '网格'或其基类之一。

答案 1 :(得分:0)

无法将TargetType设置为按钮,以便此样式仅应用于Button?

<Style x:Key="MyStyle" TargetType="Button">
  <Setter Property="Background" Value="Red" />
</Style>

答案 2 :(得分:0)

可悲的是,风格并不像那样。如果您有一个已知的子集合,您可以欺骗(丑陋):

<Setter Property="{Binding RelativeSource={RelativeSource Self} Path=Children[0].Background}" Value="Red" />

当然,这只有在你了解儿童指数时才有效,而且非常脆弱。我不确定它是否适用于你的情况b / c你说必须将样式应用于网格,所以我猜测网格内容是动态生成的。