Excel Addin中的WPF资源字典

时间:2013-09-17 09:41:14

标签: wpf excel dictionary resources

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

我正在创建一个Excel Addin,并希望使用WPF使其看起来更好一些。本地(据我所知)Addins必须是WinForm。我开始使用WPF Element Hosting但是reult并不是很好。然后我发现在解决方案中添加WPF项目很有用,但现在我想使用资源字典来保持表单看起来相同并减少内联样式。我不能让合并的词典起作用。

我尝试了Pack URI和; component / .....但都没有工作。

我做错了什么?

------- ------- EDIT

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

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

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

ProjectC,其中包含资源字典

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

3 个答案:

答案 0 :(得分:0)

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

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

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

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

答案 1 :(得分:0)

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

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

这类似于此处和this post中报告的问题。

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

e.g。这工作

<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>

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

此致 艾伦

答案 2 :(得分:0)

我是这样做的:

  1. 在运行时添加字典

function foo(t: number, s?: string): string | boolean

  1. 在 xaml 中使用 DynamicResource

    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") });

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