ResourceDictionary.Source属性中的MarkupExtension

时间:2016-10-11 13:50:27

标签: c# wpf xaml resourcedictionary markup-extensions

我正在尝试创建一个标记扩展,简化了为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。

1 个答案:

答案 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>

在运行时正常工作,使曲线静音,并允许设计师工作。但是,它无法在设计模式下合并资源文件。仍然不理想。

更新

OP比我聪明。这样做可以做到:

public class LocalResourceDictionary : ResourceDictionary
{
    public LocalResourceDictionary()
    {
        Source = new Uri("pack://application:,,,/MyAssemblyName;component/Resourc‌​es.xaml", UriKind.Absolute);
    }
}