我正在尝试创建一个标记扩展,简化了为WPF ResourceDictionary的Source属性编写URI。
问题的最小例子如下:
CS:
public class LocalResourceExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new Uri("Resources.xaml", UriKind.Relative);
}
}
XAML:
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary Source="{mw:LocalResource}" /> <!-- error MC3022 -->
<!-- <ResourceDictionary Source="Resources.xaml" /> --> <!-- Works fine -->
</UserControl.Resources>
<!-- ... -->
</UserControl>
这不会编译并出现以下错误:
error MC3022: All objects added to an IDictionary must have a Key attribute or some other type of key associated with them.
但是,如果我用常量值替换标记扩展名(如注释行所示),一切正常。
为什么带扩展标记的版本不起作用?它有解决方法吗?
我正在使用MSVC 2015。
答案 0 :(得分:2)
这对我有用:
public class LocalResource : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new ResourceDictionary() {
Source = new Uri("Resources.xaml", UriKind.Relative)
};
}
}
XAML
<Window.Resources>
<myNamespace:LocalResource />
</Window.Resources>
XAML编辑器在设计时蓝色曲线<myNamespace:LocalResource />
,它会杀死设计视图。因此,只有在您不使用“设计”视图时才有效。我不是,但有些人这样做。
我一直告诉我的女朋友我是伽利略以来最伟大的天才,她只是不相信我。伽利略将找到一种方法使设计视图工作。
解决方案二:
public class LocalResourceDictionary : ResourceDictionary
{
public LocalResourceDictionary()
{
Source = new Uri("Resources.xaml", UriKind.Relative);
}
}
XAML
<Window.Resources>
<myNamespace:LocalResourceDictionary />
</Window.Resources>
在运行时正常工作,使曲线静音,并允许设计师工作。但是,它无法在设计模式下合并资源文件。仍然不理想。
public class LocalResourceDictionary : ResourceDictionary
{
public LocalResourceDictionary()
{
Source = new Uri("pack://application:,,,/MyAssemblyName;component/Resources.xaml", UriKind.Absolute);
}
}