如何正确地重新映射XAML名称空间
本文关键字:XAML 空间 映射 正确地 新映射 | 更新日期: 2023-09-27 18:12:46
我已经创建了一个标记扩展:
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属性。