C# 如何正确地重新映射我的XAML命名空间?

C# 如何正确地重新映射我的XAML命名空间?,c#,.net,wpf,namespaces,markup-extensions,C#,.net,Wpf,Namespaces,Markup Extensions,我创建了一个标记扩展: namespace Utils { public class CoolExtension : MarkupExtension { private string key; public CoolExtension () { } public CoolExtension(string key) { this.key = key;

我创建了一个标记扩展:

namespace Utils
{
    public class CoolExtension : MarkupExtension
    {
        private string key;

        public CoolExtension ()
        {
        }

        public CoolExtension(string key)
        {
            this.key = key;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return "!"+key+"!";
        }
    }
}
[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]
<Button Content="{Cool test}" />
接下来,我在AssemblyInfo中添加了XmlnsDefinitionAttribute,以将名称空间UTIL重新映射到默认名称空间,这样我就不需要名称空间来使用标记扩展:

namespace Utils
{
    public class CoolExtension : MarkupExtension
    {
        private string key;

        public CoolExtension ()
        {
        }

        public CoolExtension(string key)
        {
            this.key = key;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return "!"+key+"!";
        }
    }
}
[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]
<Button Content="{Cool test}" />
最后,在我的窗口中,我使用了扩展:

namespace Utils
{
    public class CoolExtension : MarkupExtension
    {
        private string key;

        public CoolExtension ()
        {
        }

        public CoolExtension(string key)
        {
            this.key = key;
        }

        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return "!"+key+"!";
        }
    }
}
[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]
<Button Content="{Cool test}" />

XAML编辑器不在任何地方加下划线以显示错误,XAML设计器按预期显示输出(一个包含“!test!”内容的按钮)

但它不编译!在错误列表中,我得到一条消息,在名称空间中找不到“Cool”


我做错了什么(为了去掉扩展的名称空间)

不幸的是,WPF在同一程序集中不支持此功能。阻止在同一命名空间中使用XmlnsDefinition的根本原因是,必须在生成程序集之前解析XAML文件,以便生成要包含在程序集中的XAML所隐含的代码

XAML编译器生成代码隐藏文件(例如,以.g.cs结尾的文件),然后这些文件成为包含XAML文件的程序集的一部分


由于程序集尚未生成,XAML编译器无法加载它以确定是否已指定XmlnsDeclaration属性。

没错。您只需要将标记扩展和XAML命名空间定义放在另一个程序集中,然后在希望在XAML中使用它的程序集中引用它。我一直在使用这种变通方法。