从另一个WPF库扩展现有Generic.xaml样式

vvppvyoh  于 2023-04-22  发布在  其他
关注(0)|答案(2)|浏览(232)

我正在使用HandyControls WPF库,但我想调整其默认样式之一。我想使用应用EventSetter的样式向所有NumericUpDown控件添加'OnClick'事件。我想将此样式应用于应用程序中的所有NumericUpDown,就像HandyControls自己的NumericUpDownBaseStyle一样。
我有一个Generic.xaml文件。我知道它可以工作,因为我已经为我们的一个自定义UserControls(HandyControls库没有自己的样式)提供了样式,并且该样式将 * 默认 * 应用于该自定义控件的所有示例。
但是当我在 * Generic.xaml * 中添加以下内容时:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:hc="https://handyorg.github.io/handycontrol"
x:Class="Generic">

<Style BasedOn="{hc:StaticResource NumericUpDownBaseStyle}" TargetType="hc:NumericUpDown">
    <EventSetter Event="MouseDown" Handler="OnClick"/>
    <Setter Property="Background" Value="Red"/>
</Style>

样式不会应用于NumericUpDown的示例。相反,NumericUpDown控件仍使用HandyControls中的默认样式。
如果我把这个样式放到一个全局资源字典中(自从发现Generic.xaml后,我就试图淘汰这个字典),样式 * 就被应用了,我可以看到我的NumericUpDowns变成了红色。
为什么我的Generic.xaml文件不能优先于HandyControls中定义的样式?我如何解决这个问题?

dwthyt8l

dwthyt8l1#

Generic.xaml用于定义控件的默认样式。它不用于扩展或重写在其他程序集中定义的控件的默认样式。
您应该使用“全局”样式来完成此操作,即将基于NumericUpDownBaseStyle的自定义样式直接放在App.xaml中,或者放在从App.xaml合并的资源字典中。不要将其放在Generic.xaml中。

dxxyhpgq

dxxyhpgq2#

我几天前发布了我自己的答案,但是那个答案已经被删除了?太好了。
最后,我通过将外部库合并到Generic.xaml顶部的字典中来解决这个问题。我仍然不知道为什么要这样做。

<ResourceDictionary
    xmlns:hc="https://handyorg.github.io/handycontrol">

    <ResourceDictionary.MergedDictionaries>
        <!-- External Libraries -->
        <ResourceDictionary Source="/HandyControl;component/Themes/Theme.xaml"/>
    </ResourceDictionary.MergedDictionaries>>
</ResourceDictionary>

相关问题