如何正确地重新映射XAML名称空间



我已经创建了一个标记扩展:

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+"!";
        }
    }
}

接下来,我在AssemblyInfo中添加XmlnsDefinitionAttribute以将名称空间Utils重新映射到Default-Namespace,这样我就不需要名称空间来使用标记扩展:

[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]

最后,在我的窗口中,我使用扩展名:

<Button Content="{Cool test}" />

xhtml编辑器不会用下划线来显示错误,xhtml设计器会按照预期显示输出(一个内容为"!test!"的按钮)。

但是无法编译!在错误列表中,我有"Cool"在命名空间http://schemas.microsoft.com/

中找不到的消息。

我做错了什么(为我的扩展摆脱命名空间)?

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

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

由于程序集尚未构建,所以XAML编译器无法加载它以确定是否指定了XmlnsDeclaration属性。

最新更新