1

我创建了一个标记扩展:

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}" />

XAML 编辑器不会在任何内容下划线以显示错误,并且 XAML 设计器按预期显示输出(带有“!test!”作为内容的按钮)。

但它不编译!在错误列表中,我的消息是在命名空间http://schemas.microsoft.com/中找不到“Cool”

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

4

1 回答 1

2

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

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

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

于 2014-07-18T13:38:52.487 回答