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

jei2mxaa  于 2023-01-21  发布在  其他
关注(0)|答案(5)|浏览(174)

我正在尝试在我的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.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的构建操作应该是page,事实也确实如此。
任何帮助将不胜感激!

9gm1akwq

9gm1akwq1#

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

velaa5lx2#

现在我已经解决了这个问题,我意识到我的问题中缺少了一个重要的信息:我是按照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加载Material设计库(第一行代码使用MaterialDesignTheme. wpf,第二行代码使用MaterialDesignColors),因为(我假设)它在编译时就已经知道需要这些库了。

jbose2ul

jbose2ul3#

ResourceDictionary中删除<ResourceDictionary x:Key="123">元素以开始:

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

0g0grzrc4#

不添加这些行。仔细检查MaterialDesign dll文件是否复制到应用程序的输出路径。
我以前见过这样的问题,只是添加无意义的代码和Visual Studio意识到您的应用程序,依赖于您的库也依赖于材料设计库,然后复制dll再次作为一个人会期望摆在首位。
您可以不添加这些行
1.参考材料也可直接在应用中进行设计
1.使用生成事件确保将DLL复制到生成路径。

yquaqz18

yquaqz185#

这条评论为我解决了这个问题,但请确保你没有其他错误,如果你刚刚找到他们并修复主题,然后尝试运行该项目,它会工作。

using MaterialDesignColors;
using MaterialDesignThemes.Wpf;

public MainWindow()
{
    InitializeMaterialDesign();
    InitializeComponent();
}

private void InitializeMaterialDesign()
{
    // Create dummy objects to force the MaterialDesign assemblies to be loaded
    // from this assembly, which causes the MaterialDesign assemblies to be searched
    // relative to this assembly's path. Otherwise, the MaterialDesign assemblies
    // are searched relative to Eclipse's path, so they're not found.
    var card = new Card();
    var hue = new Hue("Dummy", Colors.Black, Colors.White);
}

相关问题