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

标签 c# .net wpf namespaces markup-extensions

我创建了一个标记扩展:

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 设计器会按预期显示输出(带有“!测试!”作为内容的按钮)。

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

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

最佳答案

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

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

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

关于c# - 如何正确地重新映射我的 XAML 命名空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24741451/

相关文章:

c# - 如何从任何 Windows 应用程序(第二个剪贴板)复制和粘贴文本

c# - String[] 可以在其中保存 System.Object 吗?

c# - 正则表达式获取 C# 中模式的所有可能匹配项

c# - Eratosthenes 优化筛

c# - 为什么 .NET 异常没有被 try/catch block 捕获?

WPF,与 TemplatedParent 绑定(bind)时有趣的事情

WPF MultiBinding - UnsetValue 问题

c# - 当字段名包含空格时反序列化 JSON

PythonNet - 如何填充 __dict__ - ipython 可以,python 没有

c# - WCF 服务自主机 url 未获取 wsdl 文档