我创建了一个标记扩展:
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/