【问题标题】:Expander.Content only applied to oneExpander.Content 仅适用于一个
【发布时间】:2016-08-12 00:41:25
【问题描述】:

我正在尝试将样式应用于具有相似外观和功能的多个扩展器。但问题是,如果我设置 Expander.Content 样式,那么其中只有一个会有内容,其余的都是空的。

小例子:

<Style TargetType="Expander" BasedOn="{StaticResource {x:Type Expander}}">
    <Setter Property="Header">
        <Setter.Value>
            Header
        </Setter.Value>
    </Setter>
    <Setter Property="Content">
        <Setter.Value>
            <TextBlock Text="1"/>
        </Setter.Value>
    </Setter>
</Style>

<!-- .... -->

<Expander Grid.Row="0"/>
<Expander Grid.Row="1"/>
<Expander Grid.Row="2"/>

如您所见,在设计时只有第二行有内容 (1)。在运行时,只有最后一个扩展器具有内容 (1)。

如果我点击第一个扩展器,第三个扩展器中的内容 (1) 实际上会移动到第一个扩展器。

为什么会这样?以及如何解决?

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    样式只创建一个实例,对于视觉元素,它只能是单个父级的子级。直接设置ContentTemplate 而不是Content(模板只是描述使用它的控件要创建的内容,因此可以共享。)

    【讨论】:

    • 为什么 Header 创建了 3 个实例,但只创建了一个用于内容的实例?
    • @Steve:因为您将它设置为字符串"Header",它不是可视元素(不像TextBlock)。
    • 所以所有样式只创建一个实例并在它适用的所有元素之间共享它。如果我想在样式中使用视觉元素,但希望它们在元素之间有所不同,请使用模板。我理解正确吗
    • @Steve:是的,你做到了。
    • @Steve:如果您想要完全相同的对象,您也可以在资源字典中定义它并将x:Shared 设置为false,然后当您通过StaticResource 以样式引用它时将被复制。
    猜你喜欢
    • 1970-01-01
    • 2015-08-28
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2013-03-20
    • 2012-05-19
    相关资源
    最近更新 更多