Windows 8 为什么在子类按钮控件中重写OnApplyTemplate()会导致访问冲突错误?

Windows 8 为什么在子类按钮控件中重写OnApplyTemplate()会导致访问冲突错误?,windows-8,windows-runtime,microsoft-metro,Windows 8,Windows Runtime,Microsoft Metro,我在处理C++/CX中的Windows.UI.Xaml.Button类的子类时遇到了这个问题,我想知道发生了什么 如果我将Button控件子类化,并将该子类的一个实例添加到网格中,那么一切都会按预期进行 如果将OnApplyTemplate()的重写方法添加到子类中,则在将子类实例添加到网格中时会得到NULL pointerexception 我的代码大致如下所示(LayoutRoot是MainPage.xaml中的一个网格,此示例已在一个空的简单metro应用程序中进行了测试): 请注意,此问

我在处理C++/CX中的Windows.UI.Xaml.Button类的子类时遇到了这个问题,我想知道发生了什么

如果我将Button控件子类化,并将该子类的一个实例添加到网格中,那么一切都会按预期进行

如果将OnApplyTemplate()的重写方法添加到子类中,则在将子类实例添加到网格中时会得到NULL pointerexception

我的代码大致如下所示(LayoutRoot是MainPage.xaml中的一个网格,此示例已在一个空的简单metro应用程序中进行了测试):


请注意,此问题与稍有相似,但错误和场景完全不同,因此我可以单独发布此问题。更新:

随着消费者预览/VisualStudio11测试版的推出,这个问题已经消失了。OnApplyTemplate()方法是虚拟的,OnApplyTemplateCore()方法不存在了。我花了一段时间才弄明白,因为我实现了现在已经过时的虚拟方法,所以出现了非常奇怪的编译器错误


旧答案,适用于开发者预览:

答案让我为没有正确阅读文档而感到羞愧:

OnApplyTemplate()方法不是虚拟的,因此无法重写它。 通过使用可重写的OnUpdateTemplateCore()方法解决了此问题

出于某种原因,它在某种程度上一直对我有效(而且编译器肯定没有对此发表任何意见),但重写它绝对不是正确的做法

// Scenario 1: This works
LayoutRoot->Children->Append(ref new MyButton1());

// Scenario 2: This doesn't work, it will cause a NULL-pointer exception
LayoutRoot->Children->Append(ref new MyButton2());

// This is how MyButton1 and MyButton2 is defined
public ref class MyButton1 : public Button { 
  public:
    MyButton1() {};
    ~MyButton1() {};
};

public ref class MyButton2 : public Button { 
  public:
    MyButton2() {};
    ~MyButton2() {};
    virtual void OnApplyTemplate() override {};
};