Wpf 是否可以在代码隐藏中声明命名空间

Wpf 是否可以在代码隐藏中声明命名空间,wpf,xaml,Wpf,Xaml,是否可以声明如下名称空间: <Window xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="MyApp.MainWindow"/> 目的:减少冗长;在一个位置声明名称空间并使用继承 编辑:我试着添加 [assembly: XmlnsDefinition("http://mycompany/myapp", "clr-namespace:MyApp.Controls")] [assembl

是否可以声明如下名称空间:

<Window xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        x:Class="MyApp.MainWindow"/>
目的:减少冗长;在一个位置声明名称空间并使用继承

编辑:我试着添加

[assembly: XmlnsDefinition("http://mycompany/myapp", "clr-namespace:MyApp.Controls")]
[assembly: XmlnsPrefix("http://mycompany/myapp", "myc")]
AssemblyInfo.cs
但构建结束时出现错误“未定义名称空间前缀“myc”


因此,我在xaml文件所在的同一项目中使用attirbutes。

不,名称空间是的一部分,与xaml/.Net无关

如果名称空间是在代码隐藏中声明的,则XAML将不是有效的XML文档。

在引用程序集的代码中,有一个Uri映射到代码名称空间:

[XmlnsDefinitionAttribute("http://yournamespace/", "Your.Assembly.Namespace")]
您可以包括这些属性中的多个,通常是在
AssemblyInfo.cs
中,允许Xaml中的单个Uri命名空间引用多个代码命名空间

例如,如果将反编译器指向
PresentationCore
程序集,则可以在程序集级别看到如下属性:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/netfx/2007/xaml/presentation", "System.Windows.Ink")]
这就是Uri导入映射到代码名称空间的方式


(完全公开:我的答案来自我之前对一个类似问题的回答。)

不那么详细,但必须进入另一个文件才能知道对象来自哪个名称空间,这会很烦人<代码>@Vache:我认为这取决于使用情况。如果在不同(程序集)名称空间中有一个程序集,其中包含了大量的通用Xaml组件,那么使用单个(xml)名称空间引用整个程序集是很方便的。类似地,如果项目复杂,则可以通过单个xml命名空间引用多个程序集。不是这样。马上看我的答案……:)哈我实际上已经使用了这个属性,但忘记了它。好的调用+1。可能不完全正确,但XML毕竟需要ns和前缀声明,我的目标是在一个不可能的中心位置消除它。我还需要
XmlnsPrefix
属性。请参阅我的编辑:它似乎不是开箱即用的。我不确定您做了什么,但是,一旦添加了
XmlnsDefinition
属性,您仍然需要声明
xmlns:foo=http://mycompany/myapp
在xaml的根元素中。你包括了吗?您不需要
xmlnprefix
来实现此功能。是的,使用前缀声明可以实现此功能,但我的想法是同时声明前缀,但这种方式似乎不起作用。您可以声明默认前缀以供序列化使用,但仍必须在XAML文件中声明命名空间和前缀。
[assembly: XmlnsDefinition("http://schemas.microsoft.com/netfx/2007/xaml/presentation", "System.Windows.Ink")]