C# 如何正确地重新映射我的XAML命名空间?
我创建了一个标记扩展:C# 如何正确地重新映射我的XAML命名空间?,c#,.net,wpf,namespaces,markup-extensions,C#,.net,Wpf,Namespaces,Markup Extensions,我创建了一个标记扩展: namespace Utils { public class CoolExtension : MarkupExtension { private string key; public CoolExtension () { } public CoolExtension(string key) { this.key = key;
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+"!";
}
}
}
[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]
<Button Content="{Cool test}" />
接下来,我在AssemblyInfo中添加了XmlnsDefinitionAttribute,以将名称空间UTIL重新映射到默认名称空间,这样我就不需要名称空间来使用标记扩展:
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+"!";
}
}
}
[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]
<Button Content="{Cool test}" />
最后,在我的窗口中,我使用了扩展:
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+"!";
}
}
}
[assembly: XmlnsDefinitionAttribute("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "Utils")]
<Button Content="{Cool test}" />
XAML编辑器不在任何地方加下划线以显示错误,XAML设计器按预期显示输出(一个包含“!test!”内容的按钮)
但它不编译!在错误列表中,我得到一条消息,在名称空间中找不到“Cool”
我做错了什么(为了去掉扩展的名称空间) 不幸的是,WPF在同一程序集中不支持此功能。阻止在同一命名空间中使用XmlnsDefinition的根本原因是,必须在生成程序集之前解析XAML文件,以便生成要包含在程序集中的XAML所隐含的代码 XAML编译器生成代码隐藏文件(例如,以.g.cs结尾的文件),然后这些文件成为包含XAML文件的程序集的一部分
由于程序集尚未生成,XAML编译器无法加载它以确定是否已指定XmlnsDeclaration属性。没错。您只需要将标记扩展和XAML命名空间定义放在另一个程序集中,然后在希望在XAML中使用它的程序集中引用它。我一直在使用这种变通方法。