【问题标题】:UWP Why does a style not apply to TargetTypes in DataTemplate?UWP 为什么一个样式不适用于 DataTemplate 中的 TargetTypes?
【发布时间】:2016-02-05 05:42:52
【问题描述】:

给定 Page.Resource 中的样式:

    <Style x:Name="ItemTitle" TargetType="TextBlock">
        <Setter Property="FontSize" Value="16"></Setter>
        <Setter Property="FontWeight" Value="Bold"></Setter>
    </Style>

它可以正确应用于同一页面上的任何常规 TextBlock。

但是,当我为该页面上 GridView 中的项目使用 DataTemplate 时,此样式不适用。

    <DataTemplate  x:Key="Output" x:DataType="vm:Output">
        <TextBlock Text="{x:Bind Text}"></TextBlock>
    </DataTemplate>

当我在 DataTemplate 上明确应用样式时,它确实有效,例如:

    <DataTemplate  x:Key="Output" x:DataType="vm:Output">
        <TextBlock Style="{StaticResource ItemTitle}" Text="{x:Bind Text}"></TextBlock>
    </DataTemplate>

有人知道怎么回事吗?

【问题讨论】:

    标签: xaml uwp


    【解决方案1】:

    这是意料之中的,也是有意的。如果它不是从 Control 派生的(如 DataTemplate),那么它不会继承隐式样式,除非它们作为全局默认值存在于应用程序资源字典中。

    或者更具体地说;

    在查找不是 Control 子类型的元素的隐式样式时,模板被视为封装边界。

    希望这会有所帮助。干杯。

    附录:

    如果你有很多相同的元素嵌套在一个模板中,你可以只设置一次,并允许它继承到所有类型的嵌套控件,例如(伪);

    <Parent>
      <Parent.Resources>
        <Style TargetType="TextBlock" BasedOn="{StaticResource ItemTitle}"/>
      <Parent.Resources>
    
      <!-- These will all inherit the Style resource now,
           without explicit style setting individually. -->
      <TextBlock/>
      <TextBlock/>
      <TextBlock/>
    
    </Parent>
    

    【讨论】:

    • 我确实尝试将模板的内容包装在 中,但这也无济于事(不确定是否真的有)。不过很遗憾,因为这意味着很多额外的明确的样式分配,否则这些是不必要的。
    • 我目前有 8 个(非常相似)带有 StackPanel、TextBlock 和自定义控件的 DataTemplates(现在...),我正在寻找一种方法来避免必须在所有这些控件。我喜欢 WPF 中的这种方法,它可以为单个集合中的不同数据类型自动选择不同的数据模板(例如,从同一基类继承的搜索结果),最近甚至通过用 EditViewModel 类替换项目来滥用它......。当我认为这是正确的答案时,肯定会标记您的答案! ;)
    • 现在我决定采用不同的解决方案,为所有重复使用的部分创建用户控件。无论如何,这更有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-23
    • 2018-06-30
    • 2019-09-21
    • 1970-01-01
    相关资源
    最近更新 更多