wpf 使用ControlzEx.ThemeManager更改主题不适用于全局定义的样式

3pmvbmvn  于 2023-06-24  发布在  其他
关注(0)|答案(1)|浏览(293)

我正在使用ThemeManager provided by the ControlzEx library来启用应用程序中主题之间的切换。
当直接在控件上设置样式属性时,这将按预期工作,例如:

MainWindow.xaml

<Window Background="{DynamicResource WhiteBrush20}">

如果我调用ThemeManager.ChangeTheme(),窗口背景将按预期变化。
但是,如果我尝试使用相同的方法在资源字典中定义全局样式,如下所示:

控件.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style TargetType="{x:Type Window}">
        <Setter Property="Background"
                Value="{DynamicResource WhiteBrush20}" />
    </Style>
    
</ResourceDictionary>

当调用ThemeManager.ChangeTheme()时,什么也没有发生。
我的App.xaml看起来像这样:

<Application x:Class="ThemingDemoApp.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:ThemingDemoApp"
             StartupUri="MainWindow.xaml">
    <Application.Resources>

        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/Resources/Controls.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <local:ThemeProvider x:Key="{x:Static local:ThemeProvider.DefaultInstance}" />

        </ResourceDictionary>
    </Application.Resources>
</Application>

我已经尝试添加一个主题文件的应用程序资源最初,但这并没有什么区别。
是否可以在全局定义的样式中使用动态资源,或者我必须直接在每个控件上实现动态样式?
下面是一个repo,其中有一个最小的例子来说明它是如何不工作的:https://github.com/will-scc/ThemingDemoApp

bcs8qyzn

bcs8qyzn1#

Controls.xaml中的全局窗口样式没有应用到您示例中的窗口。这与您正在使用的主题管理器无关。
您应该显式设置窗口的Style属性,或者使用here建议的任何其他方法将Style应用到Window

<Window x:Class="ThemingDemoApp.MainWindow"
        ...
        Style="{StaticResource windowStyle}" />

控件.xaml:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Style x:Key="windowStyle" TargetType="{x:Type Window}">
        <Setter Property="Background"
                Value="{DynamicResource WhiteBrush20}" />
    </Style>

</ResourceDictionary>

相关问题