Почему добавление подклассных элементов управления 2-го уровня в Grid дает E_INVALIDARG? - PullRequest
2 голосов
/ 15 февраля 2012

Я сталкивался с этой проблемой, связанной с подклассами класса 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 (пока) невозможен на подкласс. Это наблюдение заставляет меня поверить, что класс должен сделать что-то явное, чтобы оно было наследуемым.

...