【问题标题】:In a ControlTemplate, I want to apply the same style to all TextBlocks在 ControlTemplate 中,我想对所有 TextBlocks 应用相同的样式
【发布时间】:2014-11-23 11:08:52
【问题描述】:

我有一个类库,在其中我为 TextBlock 创建了默认样式,该样式适用于使用该类库的任何应用程序中的每个 TextBlock。

问题是我有时需要在其他一些控件(例如,功能区或我自己的自定义控件)中排除 TextBlocks。文本块不可访问,例如选项卡项标题内的文本块。

有什么方法可以强制 wpf 对一个控件内的所有 TextBlocks 使用另一种样式?

谢谢

【问题讨论】:

  • 不幸的是,我认为没有简单的解决方案,请查看stackoverflow.com/questions/27057639/…(查看 Mike Strobe 未接受的答案)。
  • 谢谢@KingKing,链接很棒。有趣的是,迈克的回答是昨天的!

标签: c# wpf xaml


【解决方案1】:

只需向嵌套在引用资源字典的控件中的TextBlock 的任何祖先的资源字典添加一个空(或任何其他)样式,其中定义了全局样式。例如,为TextBlock 定义的全局样式不会在这种情况下应用(如果资源字典被Button 控件的祖先引用):

<Button>
    <Button.Resources>
        <Style TargetType="TextBlock"/>
    </Button.Resources>
    <TextBlock Text="FooBar"/>
<Button>

【讨论】:

  • 谢谢,这是非常期待的,但实际上它不起作用。
  • 它确实适用于仅为测试此解决方案而创建的简单项目,因此错误必须是特定于您的代码的问题。您能否提供一些可以阐明问题的代码?对于初学者,如何定义默认样式以及如何强制应用程序中的所有TextBlocks 使用该样式?
  • 在我的类库中,在 Themes 文件夹中,我有一个名为 TextBlockStyles 的 ResourceDictionary 文件,带有 &lt;Style TargetType="TextBlock"&gt;... 这是在 Generic.xaml 中合并的。在我的应用程序中,类库中的 generic.xaml 被合并,因此它的所有样式都应用于应用程序中的所有相应控件。
  • 我已经重新创建了您描述的项目结构,并且提供的示例仍然按预期工作。尝试创建新的 WpfApplication 项目,添加对相关库和资源字典的引用,将上面的代码放在主窗口中,看看样式是否应用于TextBlock。如果是,那么故障一定在您的控制库中的某个地方。否则它在“消费者”项目中的某个地方。另一方面 - TextBlock 是您不想将样式应用于嵌套在您的一个控件内的某处,或者更确切地说是在“消费者”项目中?
  • 我还从头开始重新创建了测试项目,结果好坏参半。我只能在我自己的CustomControls 中更改裸TextBlocks 和TextBlocks 的外观。例如,无论我做什么,按钮都会得到不需要的样式。有关Mike Strobel's answer 中给出的原因的更多信息。非常感谢
【解决方案2】:

好的。事实证明,这是不可能的,请参阅Mike Strobel 的答案以了解原因及其背后的合理性。

解决方法是不要为 TextBlock 创建隐式样式,因为它会影响其他 ControlTemplates 内的 TextBlocks。

对我有用的是从TextBlock 派生一个类,比如Label 并将我的样式应用到它,然后在我想要具有该特定样式的TextBlock 的任何地方使用它。

一种更“Wpf Natural”的处理方式是使用键创建样式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2017-10-30
    • 2016-02-04
    • 1970-01-01
    相关资源
    最近更新 更多