Почему переопределение OnApplyTemplate () в подклассовом элементе управления Button дает ошибку нарушения доступа? - PullRequest
0 голосов
/ 15 февраля 2012

Я столкнулся с этой проблемой, связанной с созданием подкласса класса Windows.UI.Xaml.Button в C ++ / CX, и я хотел бы знать, что происходит.

Если я создаю подкласс управления 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 {};
};

Обратите внимание, что этот вопрос немного похож на этот вопрос , но ошибка и сценарий достаточно разные, чтобы я мог опубликовать этот вопрос отдельно.

1 Ответ

1 голос
/ 15 февраля 2012

ОБНОВЛЕНИЕ:

В версии Consumer Preview / Visual Studio 11 Beta эта проблема исчезла. Метод OnApplyTemplate () является виртуальным, а метод OnApplyTemplateCore () пропал. Мне потребовалось некоторое время, чтобы понять это, так как я получил довольно странные ошибки компилятора из-за моей реализации ныне ушедшего виртуального метода.


Старый ответ, относится к Предварительный просмотр для разработчиков :

Ответ заставляет меня стыдиться того, что я не прочитал документацию должным образом:

Метод OnApplyTemplate () является не виртуальным , поэтому мы не можем переопределить его. Проблема решается путем использования переопределяемого метода OnUpdateTemplateCore () .

По какой-то причине это работало для меня до определенного момента (в любом случае компилятору, конечно, нечего было сказать), но игнорировать это абсолютно не правильно .

...