Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么内容设置程序只应用于最后一个控件?_C#_Wpf - Fatal编程技术网

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
,而遵循这条路线基本上是一种绕过规则和最佳实践的方法。也就是说,这是一件很有用的事情。谢谢大家澄清这件事。你们俩都帮了大忙。