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

ResourceDictionary中的标记扩展.源属性

这是为我工作:

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视图时才有效。我不喜欢,但有些人喜欢。

我一直跟我女朋友说我是继伽利略之后最伟大的天才,她就是不相信我。伽利略会找到一种让Design view工作的方法。 <标题> 更新

方案二:

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);
    }
}