为什么向网格添加第二级子类化Button控件给出E_INVALIDARG?

时间:2012-02-15 03:07:38

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

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

如果我将控件实例添加到网格中,一切都按预期工作。

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

但是如果我将子类控件子类化并将其实例添加到网格中,我会在Grid :: Children :: Append()期间抛出E_INVALIDARG。是什么给了什么?

我的代码看起来大致如此(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() {};
};

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

更新:我认为我在阅读this article by Ian Griffiths后正确地理解了这个问题,但我需要了解更多有关此特定示例的行为的信息。可以找到重复此问题的完整代码here, see the 3rd post in the thread

更新:据我所知,到目前为止,并非所有WinRT类型都支持继承。我没有可靠的源代码参考,但我已经读过Windows.UI.Xaml类应该支持继承,但其他WinRT类型不会。 Windows.UI.Xaml.Controls.Button类显然可以做到,而我自己的MyButton1却没有。我想知道我必须做些什么来使MyButton1'可继承' Button类的方式。

我发现用Windows.UI.Xaml.Controls.ProgressBar替换Windows.UI.Xaml.Controls.Button类会使方案2失败,这告诉我ProgressBar类不是没有(还)可以继承。这种观察使我相信一个类需要做一些明确的事情才能使它成为可继承的。

0 个答案:

没有答案