C# ResourceDictionary.Source属性中的MarkupExtension
我正在尝试创建一个标记扩展,它简化了为WPF ResourceDictionary的源属性编写URI的过程 该问题的最小示例如下: CS:C# ResourceDictionary.Source属性中的MarkupExtension,c#,wpf,xaml,resourcedictionary,markup-extensions,C#,Wpf,Xaml,Resourcedictionary,Markup Extensions,我正在尝试创建一个标记扩展,它简化了为WPF ResourceDictionary的源属性编写URI的过程 该问题的最小示例如下: CS: public class LocalResourceExtension : MarkupExtension { public override object ProvideValue(IServiceProvider serviceProvider) { return new Uri("Resources.xaml", Uri
public class LocalResourceExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new Uri("Resources.xaml", UriKind.Relative);
}
}
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary Source="{mw:LocalResource}" /> <!-- error MC3022 -->
<!-- <ResourceDictionary Source="Resources.xaml" /> --> <!-- Works fine -->
</UserControl.Resources>
<!-- ... -->
</UserControl>
XAML:
public class LocalResourceExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new Uri("Resources.xaml", UriKind.Relative);
}
}
<UserControl ...>
<UserControl.Resources>
<ResourceDictionary Source="{mw:LocalResource}" /> <!-- error MC3022 -->
<!-- <ResourceDictionary Source="Resources.xaml" /> --> <!-- Works fine -->
</UserControl.Resources>
<!-- ... -->
</UserControl>
但是,如果我用一个常量值替换标记扩展(如注释行中所示),那么一切都可以正常工作
为什么带有标记扩展的版本不工作?有解决办法吗
我正在使用MSVC 2015。这对我很有用:
public class LocalResource : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new ResourceDictionary() {
Source = new Uri("Resources.xaml", UriKind.Relative)
};
}
}
XAML
XAML
你试过把它放在
里面吗?@EdPlunkett很好的解决方法,谢谢。没想到。然而,在本例中,我的扩展并没有“简化”太多,因为它在每次使用中都会增加4行……它在设计时也不起作用,所以它会蓝色地扭曲ResourceDictionary元素。无害但烦人。我认为,这里真正的解决方案是编写一个常规资源字典,它可以合并您需要的任何内容,并显式地包含这些内容。@EdPlunkett是的,我想我必须在没有自定义标记扩展的情况下进行。还是不明白有什么问题。看起来像是XAML compliler的严重限制。酷!如果LocalResourceDictionary提供了一个绝对URI(以pack:///开头),那么第二个解决方案甚至可以在设计视图中工作。@nevermind-Awesome。我试着摆弄一下背包,但没能让它工作。您使用的确切字符串是什么?Source=newURI(“pack://application:,,,/MyAssemblyName;组件/Resources.xaml“,UriKind.Absolute)代码>适合我。
public class LocalResourceDictionary : ResourceDictionary
{
public LocalResourceDictionary()
{
Source = new Uri("Resources.xaml", UriKind.Relative);
}
}
<Window.Resources>
<myNamespace:LocalResourceDictionary />
</Window.Resources>
public class LocalResourceDictionary : ResourceDictionary
{
public LocalResourceDictionary()
{
Source = new Uri("pack://application:,,,/MyAssemblyName;component/Resources.xaml", UriKind.Absolute);
}
}