【问题标题】:Base UserControl Class in Windows 8 XAML Metro AppWindows 8 XAML Metro 应用程序中的基本 UserControl 类
【发布时间】:2012-01-18 21:46:18
【问题描述】:

我正在使用 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 中运行良好。

【问题讨论】:

  • 我开始怀疑自己了; Xaml 编译器错误或尚未在任何地方记录的不同语法。接到一些电话寻求帮助,如果我发现了什么,我一定会发布它。

标签: c# xaml wpf-controls windows-8 windows-runtime


【解决方案1】:

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 对象,用于访问这些对象。这就是您可以在本机 C++ 中使用 WinRT XAML 元素的原因。

【讨论】:

  • 迁移到 WinRT 后,我将继承更改为 Windows.UI.Xaml.Controls.UserControl,但结果相同。我怀疑它要么是 Xaml 编译器中的错误,要么是我找不到文档的 WPF Xaml 和 WinRT Xaml 之间的语法更改。
  • 我试过了,这是一个错误。如果您查看 obj 目录中的 YourPage.g.cs,您会注意到该类仍显示为从 UserControl 继承。进行更改后,似乎此文件不会被覆盖。删除 obj 和 bin 文件夹后就可以正常运行了。
  • 感谢您的帮助 - 我也可以复制它。绝对是一个错误。
【解决方案2】:

是的,Win 8 XAML 支持用户控件。解决此问题的最佳方法是通过“添加新”菜单选项添加新的用户控件。这应该为您提供一个可以编译的空用户控件。然后,您可以在此模板之上构建。

【讨论】:

  • 谢谢 - 为更清晰而编辑。创建用户控件不是问题,它正在创建一种基本类型,然后从 UserControl 继承。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
  • 2012-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多