Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ResourceDictionary.Source属性中的MarkupExtension_C#_Wpf_Xaml_Resourcedictionary_Markup Extensions - Fatal编程技术网

C# ResourceDictionary.Source属性中的MarkupExtension

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

我正在尝试创建一个标记扩展,它简化了为WPF ResourceDictionary的源属性编写URI的过程

该问题的最小示例如下:

CS:

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/Resourc‌​es.xaml", UriKind.Absolute);
    }
}