1

我已经搜索了一段时间,但仍然没有更接近解决方案。这是我的情况:

我正在创建一个 Excel 插件,并希望使用 WPF 让它看起来更好一些。本机(据我所知)插件必须是 WinForm。我开始使用 WPF 元素托管,但结果不是很好。然后我发现将 WPF 项目添加到解决方案中效果很好,但现在我想使用资源字典来保持表单看起来相同并减少内联样式。我只是不能让合并的词典工作。

我尝试过 Pack URI 和 ;component/..... 但都不起作用。

我究竟做错了什么?

- - - -编辑 - - - -

我有一个名为 SolutionA 的 Excel 插件解决方案该解决方案包含 3 个项目:

ProjectA 是一个 Excel 插件项目,它引用了 ProjectB 和 ProjectC

ProjectB 是一个 WPF 项目,它引用了 ProjectC

包含资源字典的 ProjectC

只需要知道如何从 ProjectB 引用资源字典

4

3 回答 3

0

我正在使用 WPF 控件和 MahApps 样式开发 Excel 文档自定义。使用 Excel 2013 和物理 Excel 2010 框(两者都有 VS2012)在我的虚拟化开发框上一切正常。

在其他运行 Excel 2010 或 Excel 2013 的虚拟机上,这些样式不起作用。这是在运行完全相同的代码时。

这与此处和本文中报告的问题类似。

如果对您有帮助,我将分享我的发现。从各种测试看来,如果将 MahApp 资源放在 UserControl 或 Window 中,它们就可以工作。但是,将它们放在我自己的资源字典中并将该字典加载到用户控件中不起作用。

例如,这有效

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colours.xaml" />
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
        <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="pack://application:,,,/IressWorkbook;component/Assets/MyTheme.xaml" />
    </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

没有,其中 MyTheme 包含

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:System="clr-namespace:System;assembly=mscorlib">
<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colours.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/Blue.xaml" />
    <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Accents/BaseLight.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

我试图找出可以工作的机器和不工作的机器之间的区别。

问候艾伦

于 2013-09-17T22:05:56.770 回答
0

请查看MSDN 上Windows Presentation Foundation页面中的 Pack URIs。

基本上,你想要这样的东西:

<ResourceDictionary Source=
"pack://application:,,,/AssemblyName;component/FolderName/DictionaryName.xaml" />

您将需要更改AssemblyName为资源文件所在的程序集的名称和资源文件所在FolderName的任何文件夹的名称,然后DictionaryName更改为资源文件的名称。基本上,它只是资源文件的相对路径。

于 2013-09-17T10:35:31.877 回答
0

我让它这样工作:

  1. 在运行时添加字典

wpfApp = new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown }; wpfApp.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml") }); wpfApp.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml") }); wpfApp.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("pack://application:,,,/MahApps.Metro;component/Styles/Themes/Light.Blue.xaml") });

  1. 在 xaml 中使用 DynamicResource

    <ContentControl Foreground="{DynamicResource MahApps.Brushes.IdealForeground}" />

在 VS2019 中使用 net48 vsto excel 插件和 O365 本地安装版本 16.0.+

于 2021-02-10T09:37:10.427 回答