Как включить MaterialDesignXamlToolkit в библиотеку классов WPF? - PullRequest
1 голос
/ 09 апреля 2019

Я пытаюсь использовать MaterialDesignXamlToolkit в моей библиотеке классов WPF (.NET Framework).Я следую их официальному краткому руководству , но так как у меня нет App.xaml, мне пришлось внести некоторые коррективы.Возможно, какой-то шаг был неправильным, но я не знаю, какой именно.

1) Я установил MaterialDesignXamlToolkit с помощью Nuget.

2) Я создал ResourceDictionary со следующим кодом: (я указал ключ, потому чтовозникает ошибка, если я этого не сделаю)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary x:Key="123">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</ResourceDictionary>

Если я удаляю элемент <ResourceDictionary x:Key="123">, я получаю сообщение об ошибке:

System.Windows.Markup.XamlParseException: Set property 'System.Windows.ResourceDictionary.Source' threw an exception.

FileNotFoundException: Could not load file or assembly 'MaterialDesignThemes.Wpf, Culture=neutral' or one of its dependencies.

3) Мой «главный экран»Page, поэтому я добавил к нему ресурс:

    <Page.Resources>
        <ResourceDictionary Source="/MyAsembly;component/ResourceDictionary/MaterialDesign.xaml" />
    </Page.Resources>

4) Здесь возникает очевидная проблема (это второй шаг официального руководства): я добавляю следующий код на мою страницу:

<Page ...
      xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
      TextElement.Foreground="{DynamicResource MaterialDesignBody}"
      TextElement.FontWeight="Regular"
      TextElement.FontSize="13"
      TextOptions.TextFormattingMode="Ideal"
      TextOptions.TextRenderingMode="Auto"
      Background="{DynamicResource MaterialDesignPaper}"
      FontFamily="{DynamicResource MaterialDesignFont}">

Но я получаю предупреждение, что: The resource {MaterialDesignBody, MaterialDesignPaper, MaterialDesignFont} could not be resolved.

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

Любойпомощь будет принята с благодарностью!

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Удалите элемент <ResourceDictionary x:Key="123"> из вашего ResourceDictionary, чтобы начать с:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.DeepPurple.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" />
        </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

После этого вы сможете установить свойства, используя синтаксис элемента свойства после , который вы установили.Resources свойство:

<Page ... 
      d:DesignHeight="450" d:DesignWidth="800">
    <Page.Resources>
        <ResourceDictionary Source="/MyAsembly;component/ResourceDictionary/MaterialDesign.xaml" />
    </Page.Resources>
    <Page.Background>
        <DynamicResource ResourceKey="MaterialDesignPaper" />
    </Page.Background>
</Page>
0 голосов
/ 27 апреля 2019

Без добавления этих строк. Дважды проверьте, скопирован ли dll-файл MaterialDesign в выходной путь приложения.

Я уже сталкивался с такой проблемой раньше, просто добавив бессмысленный код, и Visual Studio осознает, что ваше приложение, которое зависит от вашей библиотеки, также зависит от библиотеки MaterialDesign, а затем снова копирует dll, как и следовало ожидать.

Вместо добавления этих строк вы можете

  1. Справочный материалДизайн непосредственно в вашем приложении
  2. Используйте событие сборки, чтобы убедиться, что DLL скопирована в путь сборки.
0 голосов
/ 23 апреля 2019

Теперь, когда я решил проблему, я понимаю, что в моем вопросе отсутствует одна важная информация: я следовал шаблону MVVM (поэтому весь мой код за файлами был пуст).

Проблема была в том, как Revit (приложение, для которого я создавал плагин) загружает библиотеки, которые использует плагин. Я все еще не понимаю внутреннюю логику этого, но следующие две строки, добавленные к коду позади первой загружаемой страницы, решили проблему для меня:

ColorZoneAssist.SetMode(new GroupBox(), ColorZoneMode.Accent);
Hue hue = new Hue("name", System.Windows.Media.Color.FromArgb(1, 2, 3, 4), System.Windows.Media.Color.FromArgb(1, 5, 6, 7));

Я не могу не подчеркнуть, что эти две строки кода - полная чушь (так как я не хочу помещать какую-либо логику в код), но библиотеки иначе не будут загружены. Этот код каким-то образом «заставляет» Revit загружать библиотеки дизайна материалов (1-я строка кода использует MaterialDesignTheme.Wpf и 2-й MaterialDesignColors), поскольку (я предполагаю) он уже может сказать во время компиляции, что эти библиотеки необходимы.

...