Я сталкивался с этой проблемой, связанной с подклассами класса Windows.UI.Xaml.Button в C ++ / CX, и я хотел бы знать, что происходит.
Если я добавлю экземпляр элемента управления в сетку, все будет работать как положено.
Если я создаю подкласс элемента управления и добавляю экземпляр подкласса , все работает как положено.
Но если я создаю подкласс моего подкласса элемента управления и добавляю его экземпляр в сетку, я получаю E_INVALIDARG, брошенный во время Grid :: Children :: Append (). Что дает?
Мой код выглядит примерно так (LayoutRoot является сеткой в MainPage.xaml, этот пример был протестирован в пустом простом приложении метро ):
// Scenario 1: This works (duh!)
LayoutRoot->Children->Append(ref new Button());
// Scenario 2: This works
LayoutRoot->Children->Append(ref new MyButton1());
// Scenario 3: This doesn't work, it will cause an E_INVALIDARG to be thrown by the collection
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 MyButton1 {
public:
MyButton2() {};
~MyButton2() {};
};
Обратите внимание, что этот вопрос немного похож на этот вопрос , но ошибка и сценарий достаточно разные, чтобы я мог опубликовать этот вопрос отдельно.
ОБНОВЛЕНИЕ: Я думаю, что я на правильном пути, понимая эту проблему после прочтения этой статьи Яном Гриффитсом , но мне нужно знать больше о поведении этого конкретного примера , Полный код для повторения этой проблемы можно найти здесь, см. 3-й пост в теме .
ОБНОВЛЕНИЕ: Из того, что я узнал до сих пор, не все типы WinRT поддерживают наследование. У меня нет надежных ссылок на источники для этого, но я читал, что классы Windows.UI.Xaml должны поддерживать наследование, а другие типы WinRT - нет. Класс Windows.UI.Xaml.Controls.Button, очевидно, делает, а мой собственный MyButton1 - нет. Я хотел бы знать, что мне нужно сделать, чтобы MyButton1 стал «наследуемым», как класс Button.
Я обнаружил, что замена класса Windows.UI.Xaml.Controls.Button на Windows.UI.Xaml.Controls.ProgressBar приведет к сбою сценария 2, который говорит мне, что класс ProgressBar (пока) невозможен на подкласс. Это наблюдение заставляет меня поверить, что класс должен сделать что-то явное, чтобы оно было наследуемым.