Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 没有应用主题的可主题应用程序中缺少样式的回退_.net_Wpf_Themes_Wpf Style - Fatal编程技术网

.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}">

我有一个应用程序,它使用几个可以在运行时切换的自定义主题。主题、应用程序和UI(用户控件、对话框等)都位于单独的.NET程序集中

主题不仅覆盖控件的隐式默认样式(新控件模板),而且还提供各种显式样式

例如:

<!-- "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)具有默认颜色。在我的例子中,我正在构建一个控件,它使用的网格似乎有一个默认的透明颜色,这在本例中是不需要的。我认为这与模板有关,必须有一个默认的模板或其他东西。