Manejo de eventos de metro en la clase c ++ nativa

Me gustaría manejar un evento de clic de botón en una clase c++ nativa. He intentado crear un objeto 'controlador' derivado de Object para manejar el evento y luego llamar a un método c ++. Por ejemplo probé el siguiente código:

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);
     }
 };

Pensando que podría esconder el pButtonImpl puntero y luego utilícelo para llamar a una función nativa en el Button_Clicked función. Sin embargo, al compilar este código, aparece el error:

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

Entonces parece que no le gusta que pase clases nativas a un objeto ref. ¿Hay alguna forma de hacer esto?

Tenga en cuenta que soy completamente nuevo en el desarrollo de aplicaciones de estilo Metro, ¡así que tenga paciencia conmigo!

preguntado el 30 de junio de 12 a las 17:06

2 Respuestas

Ok, todo tiene sentido para mí ahora. Para cualquier otra persona que esté interesada, la razón por la que no puede tener objetos WinRT con funciones públicas que tienen argumentos nativos de C++ es que estos objetos no serían consumibles por código que no sea de C++. Sin embargo, la solución (¿obvia?) Es hacer que el constructor sea privado y tener la clase que crea el Objeto declarada como una clase 'amiga' (¡duh!). Entonces todo está bien, el compilador está feliz y yo estoy feliz.

Gracias a todos los que se tomaron el tiempo de leer esto.

Respondido 01 Jul 12, 22:07

La respuesta correcta es usar internal más bien que public para el constructor. Esto le dice al compilador que solo estará disponible en el proyecto actual y no estará disponible para proyectos externos (es decir, una biblioteca escrita en otro idioma).

Respondido el 11 de enero de 13 a las 16:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.