.net 没有应用主题的可主题应用程序中缺少样式的回退
我有一个应用程序,它使用几个可以在运行时切换的自定义主题。主题、应用程序和UI(用户控件、对话框等)都位于单独的.NET程序集中 主题不仅覆盖控件的隐式默认样式(新控件模板),而且还提供各种显式样式 例如:.net 没有应用主题的可主题应用程序中缺少样式的回退,.net,wpf,themes,wpf-style,.net,Wpf,Themes,Wpf Style,我有一个应用程序,它使用几个可以在运行时切换的自定义主题。主题、应用程序和UI(用户控件、对话框等)都位于单独的.NET程序集中 主题不仅覆盖控件的隐式默认样式(新控件模板),而且还提供各种显式样式 例如: <!-- "Themes" assembly --> <Style TargetType="Button" x:Key="DialogButtonStyle" BasedOn="{StaticResource BaseButtonStyle}">
<!-- "Themes" assembly -->
<Style TargetType="Button" x:Key="DialogButtonStyle"
BasedOn="{StaticResource BaseButtonStyle}">
<Setter Property="HorizontalAlignment" Value="Left" />
<Setter Property="Height" Value="24" />
<Setter Property="MinWidth" Value="86" />
<Setter Property="Padding" Value="8 0" />
</Style>
<!-- "UI" assembly -->
<Button Style="{DynamicResource DialogButtonStyle}"
Content="OK" />
通过将其所有样式、画笔等合并到应用程序资源中来应用主题,例如:
<Application x:Class="GUIDemo.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary x:Name="MainDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary x:Name="ThemeDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Themes;component/SystemTheme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
(或运行时的相应代码。)
问题:
是否可以在我的UI程序集(而不是应用程序程序程序集)中定义回退样式?如果应用程序未包含任何主题,即“DialogButtonStyle”等键未定义并导致输出中出现错误消息,则应自动应用这些主题
我想要实现的是,我的UI库是完全可主题化的,但也可以在不必关心自定义主题的情况下使用
我的尝试:
(1) 定义包含回退样式的虚拟App.xaml。这在设计时(设计器预览、代码完成)起作用,但在运行时不起作用
(2) 在“Themes/Generic.xaml”中定义样式。这似乎只适用于隐式样式,而不适用于显式样式
(3) 将Generic.xaml合并到使用该样式的所有xaml文件的资源中。这不起作用,因为样式现在覆盖了主题。在合并主题资源之前,请尝试将回退样式合并到ResourceDictionary中:
<Application.Resources>
<ResourceDictionary x:Name="MainDictionary">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="FallbackResources.xaml" />
<ResourceDictionary Source="/Themes;component/SystemTheme.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
然后,主题资源(如果有的话)应该覆盖回退资源
不,我不是这个意思。我希望在UI程序集(而不是应用程序)中定义回退。回退的全部要点是确保即使应用程序正确应用了主题(或其他资源文件),也定义了样式
除非将这些回退资源合并到应用程序中,否则应用程序无法应用这些回退资源。如果应用程序未能从外部程序集中应用任何资源字典,则如果您尝试在视图中引用这些资源,则会出现运行时异常。资源必须以某种方式显式地合并到应用程序中。我也在构建一个支持主题的控件库,并遇到了这个问题。 您希望有人能够在不定义任何主题(并且看起来不奇怪)但同时支持主题颜色的项目中使用该控件 如果没有向应用程序的资源添加主题,则找不到主题颜色(资源键),控件将恢复为默认值。例如,文本框的白色背景上的黑色文本。对于网格,它是透明的,这对于基于网格的弹出控件来说是个问题 解决方案是隐式的。 基本上,您可以在需要的级别(例如在网格中或在控件级别)定义一个样式,该样式以特定类型为目标,而不使用x:key 相关问题:
不,我不是这个意思。我希望在UI程序集(而不是应用程序)中定义回退。回退的全部目的是确保即使应用程序正确地应用了主题(或其他资源文件),也定义了样式。那么就不需要了。您需要明确地告诉应用程序这些资源实际上存在,以及在哪里可以找到它们。我编辑了我的答案。@mm8这似乎不对,有几个标准WPF控件(例如TextBox)具有默认颜色。在我的例子中,我正在构建一个控件,它使用的网格似乎有一个默认的透明颜色,这在本例中是不需要的。我认为这与模板有关,必须有一个默认的模板或其他东西。