C# 为什么内容设置程序只应用于最后一个控件?
下面的代码将创建两个按钮,但样式将仅应用于我知道可以使用模板的第二个按钮,但我想知道为什么此设置不起作用C# 为什么内容设置程序只应用于最后一个控件?,c#,wpf,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="MainWi
<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>
样式
是共享的,因此只有一个网格
实例,而且由于可视
只能有一个父项,因此它将在您使用它的最后一个位置可见。您可以禁用Style
<Style ... x:Shared="False">
设置为false时,修改WPF资源检索行为,以便对属性化资源的请求为每个请求创建一个新实例,而不是为所有请求共享同一实例
您不能(或至少不应该)在Setter
中使用UI元素,因为UI元素只能存在于可视树中的一个位置。也就是说:一个UI元素只能有一个父元素。尝试将内容设置为一些非UI值,如简单字符串,并让WPF为您应用数据模板:
<Setter Property="Content" Value="help" />
如果要指定复杂的UI内容,请改为设置ContentTemplate
;这将允许您使用DataTemplate
建立一个通用的可视化树
但是,请注意,在按钮设置器上设置
内容
是不常见的;内容通常因按钮而异,而样式用于设置控件实例中常见的属性值。最好使用模板还是将共享属性设置为false?或者这对性能有相同的影响?这只是另一种做事方式,但就我个人而言,我可以选择模板。如果可以避免这种情况,就不应该在样式设置中使用visual,如果要坚持WPF的推荐做法,就使用模板。在近十年的WPF开发过程中,我从未发现有必要使用x:Shared
,而遵循这条路线基本上是一种绕过规则和最佳实践的方法。也就是说,这是一件很有用的事情。谢谢大家澄清这件事。你们俩都帮了大忙。