ResourceDictionary中的标记扩展.源属性
本文关键字:扩展 属性 ResourceDictionary | 更新日期: 2023-09-27 18:12:38
我正在尝试创建一个标记扩展,以简化为WPF资源字典的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
这是为我工作:
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 />
标记成蓝色,这会杀死design视图。这只有在你不使用Design视图时才有效。我不喜欢,但有些人喜欢。
方案二:
public class LocalResourceDictionary : ResourceDictionary
{
public LocalResourceDictionary()
{
Source = new Uri("Resources.xaml", UriKind.Relative);
}
}
XAML
<Window.Resources>
<myNamespace:LocalResourceDictionary />
</Window.Resources>
可以在运行时正常工作,使弯弯曲曲静音,并允许设计师工作。但是,它无法在设计模式下合并资源文件。还是不理想
<标题> 更新OP比我聪明。public class LocalResourceDictionary : ResourceDictionary
{
public LocalResourceDictionary()
{
Source = new Uri("pack://application:,,,/MyAssemblyName;component/Resources.xaml", UriKind.Absolute);
}
}
标题>标题>