Excel VSTO: используйте ResourceDictionary, который находится в отдельной сборке

В моем приложении VSTO мне нужно использовать ResourceDictionary, который находится в отдельной сборке.

Я создал отдельный ResourceDictionary с именем generic.xaml в приложении VSTO в папке themes, например /themes/generic.xaml. В этом файле я сослался на ResourceDictionary из внешней сборки, используя URI Pack.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
   <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary Source="pack://application:,,,/ExternalAssemblyName;component/Themes/resource.xaml"  />
   </ResourceDictionary.MergedDictionaries>
 </ResourceDictionary>

Также изменена AssemblyInfo на следующее:

[assembly: ThemeInfo(
ResourceDictionaryLocation.None,
ResourceDictionaryLocation.SourceAssembly)]

Но все равно не повезло. Любая помощь была бы хороша.

P.S. Не предлагайте помещать ResourceDictionary в App.Xaml, поскольку я работаю над приложением VSTO, поэтому App.xaml не будет.


person Jayakrishnan    schedule 16.05.2018    source источник
comment
Если имя файла generic.xaml, укажите URL-адрес пакета как pack://application:,,,/ExternalAssemblyName;component/Themes/generic.xaml. Кроме того, ваша общая сборка загружается в AppDomain?   -  person user1672994    schedule 16.05.2018
comment
Да, я определил URL-адрес пакета в соответствии с именем файла словаря ресурсов. Нет, не могли бы вы рассказать мне, как загрузить общую сборку в AppDomain?   -  person Jayakrishnan    schedule 16.05.2018


Ответы (1)


Использование VSTO не мешает вам использовать App.xaml :)

  1. Создайте App.xaml, как обычно, и импортируйте словарь ресурсов в Application.Resources.
  2. При запуске надстройки инициализируйте приложение WPF

    private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        //Ensure the singleton WPF Application is instantiated
        if (System.Windows.Application.Current == null)
        {
            new App();
        }
    
        //Take control of WPF application shutdown
        System.Windows.Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;
    }
    
  3. Не забудьте закрыть приложение WPF при закрытии надстройки.

    private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
    {
        if (System.Windows.Application.Current != null)
        {
            System.Windows.Application.Current.Shutdown();
        }
    }
    
  4. Используйте свои стили в XAML

Пример на Github

person didzispetkus    schedule 06.06.2018