为什么内容设置器仅应用于最后一个控件?

时间:2014-10-20 20:07:28

标签: c# wpf

以下代码将创建两个按钮,但样式将仅应用于第二个我知道我可以使用模板,但我想知道为什么这个设置不起作用?

   <Window x:Class="WpfApplication9.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 TargetType="Button">
        <Setter Property="Content">
            <Setter.Value>
                <Grid>
                    <TextBlock Text="help"></TextBlock>
                </Grid>
            </Setter.Value> 
        </Setter>
    </Style>

</Window.Resources>
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition></RowDefinition>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Button Grid.Row="1" Grid.Column="0"></Button>
    <Button Grid.Row="1" Grid.Column="1"></Button>


</Grid>

2 个答案:

答案 0 :(得分:4)

您不能(或至少不应该)在Setter中使用UI元素,因为UI元素只能存在于可视树中的一个位置。也就是说:UI元素可能只有一个父元素。尝试将内容设置为某些非UI值,如简单字符串,然后让WPF为您应用数据模板:

<Setter Property="Content" Value="help" />

如果要指定复杂的UI内容,请设置ContentTemplate;这将允许您使用DataTemplate来构建一个通用的可视化树。

但请注意,在按钮设定器上设置Content是不常见的;内容通常在按钮之间变化,而样式则用于设置在控件实例中应该是通用的属性值。

答案 1 :(得分:3)

Style是共享的,因此Grid只有一个实例,因为Visual只能有一个父级,所以在您使用它的最后一个位置可以看到它。您可以停用Style

的共享
<Style ... x:Shared="False">

x:Shared Attribute

  

设置为false时,修改WPF资源检索行为,以便对属性资源的请求为每个请求创建一个新实例,而不是为所有请求共享同一个实例。