在 UWP 类库中设置用户控件的样式并在使用应用程序中覆盖它

Posted

技术标签:

【中文标题】在 UWP 类库中设置用户控件的样式并在使用应用程序中覆盖它【英文标题】:Styling user controls in UWP class library and overwrite it in consuming app 【发布时间】:2021-12-01 10:49:15 【问题描述】:

想象一个 UWP 类库,其中包含多个具有自定义逻辑的用户控件。自定义控件可能是开源的,人们可以使用它创建自己的应用程序。

-Controls
---MyTextBox
---MyButton
---and so on

这些用户控件的默认样式可以通过用户控件的 xaml 中的显式样式内联来完成。我对此进行了测试。但它不是很灵活。人们可能希望对其应用自己的样式。

想要变得更复杂,并创建了几个 ResourceDictionaries。可以说简化一下:

-Styles
--MyTextBoxDictionary.xaml
--MyButtonDictionary.xaml

暂时这些只是文件。什么都不知道。如果我想使用它们,我在 *** 上学到了,我需要一个文件“Themes/Generic.xaml”(记住我在一个 UWP 类库项目中,需要保留这个先决条件)。 在这里了解到,我需要像这样使用 MergedDictionaries 加载该文件中的字典:

<ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="MyTextBoxDictionary.xaml"/>
        <ResourceDictionary Source="MyButtonDictionary.xaml"/>
</ResourceDictionary.MergedDictionaries>

因为要加载的字典位于名为“Styles”的文件夹中,所以我需要为来自不同文件夹的同一个程序集执行类似 PACK URIS 的操作。 不工作。按钮仍然没有样式。 所以我将样式定义直接移动到“Themes/Generic.xaml”中,只是为了测试。 不工作。按钮仍然没有样式。

有几个问题:

    如何使用位于单独文件夹中的类库项目中的多个字典文件来设置自定义用户控件的样式? 如果以上方法都不可行,我还有哪些其他方法? 使用 ThemedStyles 是否也能做到这一点? 如何让消费应用覆盖我的“默认”样式?我对默认样式使用隐式样式并为覆盖样式使用显式的唯一方法不是吗?还有其他方法吗?

【问题讨论】:

【参考方案1】:

您可以像这样将 ResourceDictionary 添加到您的 Themes/Generic.xaml 文件中

<ResourceDictionary Source="/MyProject.Name/Styles/MyTextBoxDictionary.xaml" />

您可以使用“属性”窗格来设置源,而不必知道确切的语法。为此,您可以输入以下内容

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary />
</ResourceDictionary.MergedDictionaries>

在 ResourceDictionary 内单击,然后在“属性”窗口中选择您想要的源

【讨论】:

首先谢谢你,很抱歉这么晚才回复(生病了)。不幸的是,这不起作用。我的意思是您提出的添加字典的方法在技术上是可行的,但是控件没有应用样式。在阅读了更多关于它的信息后,这与我们使用的是用户控件而不是自定义控件这一事实有关,此外,来自 Generic.xaml 中合并字典的引用字典中的 x:Key 标记不会被拾取。甚至稍后在某些 App.xaml 中覆盖这些样式的部分仍然很不清楚。 用户控件不能重新设置主题。只有自定义控件可以。您可以通过右键单击项目并选择 Add -> New Item 然后选择 Custom Control (WPF) 轻松添加新的自定义控件。这将向 Generic.xaml 文件添加一个新的类和样式。将您的主题转移到 Generic.xaml 并将任何代码转移到新类。这不是一对一的转移。见:docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/…

以上是关于在 UWP 类库中设置用户控件的样式并在使用应用程序中覆盖它的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET AJAX TabControl 中设置控件样式

尝试使用 GTKLookAndFeel 在 JavaFX 中设置 SwingNode 的样式会冻结应用程序

UWP的类库和windows运行时组件有啥区别

在后面的代码中设置控件的 StaticResource 样式

如何在 UWP 类库中使用 XAML 静态资源和设计时数据

无法在 UWP 中设置 SQLite 对象 - Xamarin Forms