我正在使用 XAML 和 C# 开发 Metro 应用程序。我在 Win7 中使用 WPF 开始这个。我创建了一个继承自 UserControl 的基类,然后尝试将其放入我的 XAML 中。
在 Windows 7 中,这非常有效:
<MyType:AnImplementation
...
xmlns:MyType="clr-namespace:MyAppNamespace"
/>
我在 Win8 中尝试了同样的操作,但不幸的是,我得到了错误 -
<MyType:AnImplementation
...
xmlns:MyType="using:MyAppNamespace"
/>
现在产生这个: CompileXaml 任务意外失败。然后是空引用异常。
我不是 WPF 高手,所以我做这件事可能完全错了——我最近才开始接触它,但我在隔离这个问题时遇到了麻烦。这是某种先有鸡还是先有蛋的问题,还是有其他方法可以在 Win8 XAML 中构建自定义用户控件?
编辑:我认为说得更清楚可能会有所帮助。我在创建用户控件时没有遇到问题,但在创建属于我自己的基类型(继承自 UserControl
)的用户控件时遇到了问题。例如:
一个基类,我们称之为 MyBaseType,它继承自 UserControl 并具有一些虚方法:
public class MyBaseType : UserControl
{
public MyBaseType() : base() {}
}
一个新的用户控件,称为 ActionTile:
public partial class ActionTile : MyBaseType {}
当我将它放入我的 XAML 中时:
<myType:MyBaseType
... (other XAML imports)
xmlns:myType="using:MyNamespace"/>
编译器崩溃了。
如果要复制,创建一个继承自 UserControl
的基类,然后实现一个继承自该基类的控件并尝试创建一个新类型的新 UserControl。正如我所说,在 Windows 7 上的 WPF 中运行良好。
最佳答案
WinRT XAML 元素与 WPF XAML 元素不同。在 WPF 中,UserControl 类在命名空间 System.Windows.Controls 中定义。而 WinRT 的 UserControl 是在 Windows.UI.Xaml.Controls 中定义的。
在将代码从 WPF 移动到 WinRT 时,您必须确保使用正确命名空间中的类。通常,WPF 元素在 System.Windows 命名空间中定义,而 WinRT XAML 元素在 Windows.UI.Xaml 中定义。
Windows.UI.Xaml 中定义的 XAML 元素实际上是具有 .Net RCW 的 WinRT 对象,用于访问这些对象。这就是您可以在 native C++ 中使用 WinRT XAML 元素的原因。
关于c# - Windows 8 XAML Metro App 中的基本 UserControl 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8917914/