Как включить MaterialDesignXamlToolkit в библиотеку классов WPF?

Я пытаюсь использовать MaterialDesignXamlToolkit в своей библиотеке классов WPF (инфраструктура .NET). Я следую их официальному учебник по быстрому старту, но поскольку у меня нет 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.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 должно быть страницей, и это так.

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

@ mm8, пожалуйста, проверьте мой отредактированный вопрос.

Marija Rakic 09.04.2019 15:59
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
1
3 475
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Для начала удалите элемент <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>

Когда я делаю так, как говорит первый фрагмент кода, я все равно получаю сообщение об ошибке, упомянутое в моем вопросе: FileNotFoundException: Could not load file or assembly 'MaterialDesignThemes.Wpf, Culture=neutral' or one of its dependencies. . Я полагаю, что код ломается, прежде чем он достигает второго фрагмента кода.

Marija Rakic 11.04.2019 14:22

@MarijaRakic: Значит, вы неправильно установили пакет NuGet. Вам нужно сослаться на сборку MaterialDesignThemes.Wpf.

mm8 11.04.2019 15:51

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

Marija Rakic 11.04.2019 18:32
Ответ принят как подходящий

Теперь, когда я решил проблему, я понимаю, что в моем вопросе отсутствует одна важная информация: я следовал шаблону 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), поскольку (я полагаю) он уже может сказать во время компиляции, что эти библиотеки необходимы.

Это сработало для меня в проекте VSIX.

fix 15.10.2021 19:54

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

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

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

  1. Ссылайтесь на MaterialDesign непосредственно в своем приложении.
  2. Используйте событие сборки, чтобы убедиться, что DLL скопирована в путь сборки.

Эти файлы определенно присутствуют в папке отладки, в том же месте, где собрана моя библиотека. Не могли бы вы пояснить шаги 1 и 2? Если я добавлю using MaterialDesignThemes.Wpf; using MaterialDesignColors;, но никогда не использую в коде, эти операторы include будут игнорироваться при компиляции проекта.

Marija Rakic 29.04.2019 14:43

У меня работал принятое решение. Однако, чтобы избежать фиктивного кода, я также смог заставить MDXT работать, добавив следующее в код программной части словаря ресурсов:

Assembly.LoadFrom(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MaterialDesignThemes.Wpf.dll"));
Assembly.LoadFrom(Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "MaterialDesignColors.dll"));

Не могли бы вы показать, где именно вы поместили их в свой программный код и какие операторы использования были необходимы? Intellisense не очень хорошо помогает здесь.

fix 15.10.2021 19:52

@fix с помощью System.IO и System.Reflection. Эти строки должны находиться в конструкторе кода программной части или в любом другом месте, где они будут выполняться до того, как что-либо попытается отобразить Xaml.

Trygve 21.10.2021 17:09

Другие вопросы по теме