处理本机c ++类中的metro事件

时间:2012-06-30 16:02:49

标签: windows windows-8 microsoft-metro

我想在本机c ++类中处理按钮单击事件。我尝试创建一个派生自Object的'handler'对象来处理事件,然后调用c ++方法。例如,我尝试了以下代码:

ref class GButtonHandler sealed : public Object
 {
 public:
     void Button_Click(Object^ sender, RoutedEventArgs^ e)
     {
     }

    GTextBlockHandler(GButtonImpl * pButtonImpl, Button ^ button)
     {
         button->Click += ref new RoutedEventHandler(this, &GTextBlockHandler::Button_Click);
     }
 };

认为我可以松开pButtonImpl指针,然后用它来调用Button_Clicked函数中的本机函数。但是在编译此代码时,我收到错误:

error C3986: '{ctor}': signature of public member contains native type 'GButtonImpl'

所以它似乎不喜欢我将本机类传递给ref对象。有没有办法做到这一点?

请注意,我对开发Metro风格应用程序完全不熟悉,所以请耐心等待!

2 个答案:

答案 0 :(得分:0)

好的,现在对我来说都很有意义。对于任何感兴趣的人,你不能拥有具有本机C ++参数的公共函数的WinRT对象的原因是这些对象不会被非C ++代码消耗。但是,(显而易见的?)解决方案是使构造函数为私有,并使用创建Object的类声明为“朋友”类(duh!)。然后一切都很好,编译器很高兴,我很高兴。

感谢所有花时间阅读此内容的人。

答案 1 :(得分:0)

正确的答案是使用internal而不是public作为构造函数。这告诉编译器它只能在当前项目中使用,并且不能用于外部项目(即用其他语言编写的库)。