为什么在子类Button控件中重写OnApplyTemplate()会给出访问冲突错误?

时间:2012-02-15 03:48:37

标签: windows-8 windows-runtime microsoft-metro

我遇到过处理在C ++ / CX中继承Windows.UI.Xaml.Button类的问题,我想知道发生了什么。

如果我将Button控件子类化,并将子类的实例添加到网格中,则一切都按预期工作。

如果将OnApplyTemplate()的覆盖方法添加到子类,则在将子类实例添加到网格时会得到NULL-pointerexception。

我的代码看起来大致如此(LayoutRoot是MainPage.xaml中的网格,此示例已在空的简单城域应用程序中测试过):

// 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 {};
};

请注意,此问题与this question略有相似,但错误和情景完全不同,我可以单独发布此内容。

1 个答案:

答案 0 :(得分:1)

更新:

使用Consumer Preview / Visual Studio 11 Beta,这个问题已经消失。 OnApplyTemplate()方法是虚拟的,OnApplyTemplateCore()方法已经消失。我花了一段时间来搞清楚,因为我的编译错误非常奇怪,因为我实现了现在已经过时的虚拟方法。


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

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

OnApplyTemplate()方法非虚拟,因此我们无法覆盖它。 通过使用可覆盖的 OnUpdateTemplateCore()方法解决了这个问题。

出于某种原因,它对我起作用直到某个点(并且编译器肯定没有任何关于它的说法),但覆盖它绝对不是正确的做法