以下代码将创建两个按钮,但样式将仅应用于第二个我知道我可以使用模板,但我想知道为什么这个设置不起作用?
<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>
答案 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">
设置为false时,修改WPF资源检索行为,以便对属性资源的请求为每个请求创建一个新实例,而不是为所有请求共享同一个实例。