Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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
Wpf 如何修改默认控件主题?_Wpf_Wpf Controls - Fatal编程技术网

Wpf 如何修改默认控件主题?

Wpf 如何修改默认控件主题?,wpf,wpf-controls,Wpf,Wpf Controls,我想修改项目的默认控件模板。对于我的第一个更改,我只想在每个主题中为listview的ScrollViewer建立一个部件名 以下是我的结构: MyControlLibrary:定义一对控件并定义标准wpf控件的主题。 MyApplication:使用控件库和包含的主题 以下是我到目前为止所了解到的情况。 从以下站点下载默认主题: 将下载的主题添加到MyControlLibrary的themes文件夹中,添加必要的引用,并修改xmlns:theme命名空间以引用程序集 从这里开始,我还不知道下一

我想修改项目的默认控件模板。对于我的第一个更改,我只想在每个主题中为listview的ScrollViewer建立一个部件名

以下是我的结构: MyControlLibrary:定义一对控件并定义标准wpf控件的主题。 MyApplication:使用控件库和包含的主题

以下是我到目前为止所了解到的情况。 从以下站点下载默认主题:

将下载的主题添加到MyControlLibrary的themes文件夹中,添加必要的引用,并修改xmlns:theme命名空间以引用程序集

从这里开始,我还不知道下一步该怎么办。如果只是覆盖模板,这并不太难,但我希望应用程序仍然具有主题意识

提前谢谢

编辑: 好的,我找到了解决办法。我希望这对其他人有帮助

更新你的App.xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="{ThemeDictionary AssemblyName=AssemblyWithThemes}"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    <!-- other styles go here -->
</Application.Resources>
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="{ThemeDictionary AssemblyName=AssemblyWithThemes}"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    <!-- other styles go here -->
</Application.Resources>

其中AssemblyWithThemes是包含主题文件的Themes\文件夹的程序集的名称。我相信程序集也需要从您的应用程序中引用

非常重要的是,如果在App.xaml文件中直接包含其他资源,请将它们放置在上面的注释处,否则包含ResourceDictionary的内容将成为另一个资源,而不是设置Application.resources属性


然后,所有其他样式都需要指定BasedOn属性以保留主题更改。对于动态创建的窗口,我使用了新样式(类型),它阻止使用覆盖的主题。更改为新样式(类型、样式)后,它工作得非常好。

好的,我找到了解决方案。我希望这对其他人有帮助

更新你的App.xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="{ThemeDictionary AssemblyName=AssemblyWithThemes}"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    <!-- other styles go here -->
</Application.Resources>
<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="{ThemeDictionary AssemblyName=AssemblyWithThemes}"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    <!-- other styles go here -->
</Application.Resources>

其中AssemblyWithThemes是包含主题文件的Themes\文件夹的程序集的名称。我相信程序集也需要从您的应用程序中引用

非常重要的是,如果在App.xaml文件中直接包含其他资源,请将它们放置在上面的注释处,否则包含ResourceDictionary的内容将成为另一个资源,而不是设置Application.resources属性


然后,所有其他样式都需要指定BasedOn属性以保留主题更改。对于动态创建的窗口,我使用了新样式(类型),它阻止使用覆盖的主题。更改为新样式(类型、样式)后,效果非常理想。

请将解决方案作为答案张贴在底部,而不是将其编辑到您的问题中,这样您就可以将其标记为已回答。