如何将MaterialDesignXamlToolkit包含到WPF类库中?

时间:2019-04-09 13:48:16

标签: c# wpf mvvm revit material-design-in-xaml

我正在尝试在WPF类库(.NET框架)中使用MaterialDesignXamlToolkit。我正在关注他们的官方quick start tutorial,但是由于我没有App.xaml,因此我必须进行一些调整。显然,某一步骤是错误的,但我不知道哪一步。

1)我使用Nuget安装了MaterialDesignXamlToolkit。

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的构建操作应该是页面,而实际上是页面。

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

现在我已经解决了这个问题,我意识到我的问题中缺少一个重要的信息:我正在遵循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加载材料设计库(第一行代码使用MaterialDesignTheme.Wpf和第二个MaterialDesignColors),因为(我假设)它已经可以在编译时告知需要这些库。

答案 2 :(得分:0)

不添加这些行。 仔细检查MaterialDesign dll文件是否复制到应用程序的输出路径。

我以前已经看到过这样的问题,只需添加废话代码,Visual Studio就会意识到依赖于您的lib的应用程序也依赖于MaterialDesign lib,然后再次复制dll,就像最初希望的那样。

您可以不用添加这些行

  1. 也直接在您的应用程序中引用MaterialDesign
  2. 使用构建事件来确保将DLL复制到构建路径。

答案 3 :(得分:0)

accepted solution为我工作。但是,为了避免使用伪代码,我还可以通过在资源字典的代码后面添加以下内容来使MDXT正常工作:

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