我正在尝试在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的构建操作应该是页面,而实际上是页面。
任何帮助将不胜感激!
答案 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,就像最初希望的那样。
您可以不用添加这些行
答案 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"));