2014-10-20 23 views
0

下面的代码将创建两个按钮,但风格将只应用于第二我知道我可以使用模板,而我想知道为什么这个设置不起作用?为什么内容设置器仅适用于最后一个控件?

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

回答

4

因为UI元素只能存在于可视化树中的一个位置,所以您不能(或至少不应该)在Setter中使用UI元素。也就是说:一个UI元素可能只有一个父元素。尝试将内容以一些非UI值,就像一个简单的字符串,并让WPF应用数据模板你:如果你想指定复杂的UI内容

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

,设置ContentTemplate代替;这将允许您使用DataTemplate来构建一个通用的可视化树。

但是请注意,在按钮设置器上设置Content是不寻常的;内容通常是从按钮到按钮的变化,而样式旨在设置应该在控件实例间通用的属性值。

3

Style共享,所以存在的Grid只有一个实例,因为Visual只能有一个父它会在你使用它的最后的地方可见。您可以为Style

<Style ... x:Shared="False"> 

x:Shared Attribute

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

+0

使用模板或将共享属性设置为false会更好吗?或者这是否具有相同的性能影响? – Bob 2014-10-20 20:29:42

+1

这只是另一种做事的方式,但我个人可以选择模板。如果你可以避免它,你不应该使用视觉样式设置器 – dkozl 2014-10-20 20:43:22

+1

同意,如果你想坚持WPF的推荐做法,使用模板。在将近十年的WPF开发中,我从未发现有必要使用'x:Shared',并且这条路线基本上是一种处理规则和最佳实践的方式。这就是说,这是一个有用的事情要知道。 – 2014-10-20 21:00:18

相关问题