Ich bin neu in der Windows-Welt und glaube, dass ich mich bei einem Problem im Unkraut verirre. Ich würde gerne einen Rat von Leuten mit Erfahrung mit C ++ / CLI und WPF und XAML bekommen.
Ich habe Win32-Code und muss eine WPF-GUI ausführen. Ich fand dieses MS-Walkthrough-Beispiel, das C ++ / CLI verwendet . Ich habe es meinen Zwecken angepasst und es funktioniert großartig.
Als nächstes wollte ich den programmatischen WPF-Kram herausreißen und stattdessen XAML verwenden. Dies ist so, dass ich den XAML an eine Designerperson übergeben kann und mich selbst aus der UI-Entwurfsschleife herausnehmen kann, wo ich ganz sicher nicht hingehöre. Nach dem Lesen des Abschnitts "WPF Interoperation Projects" von WPF und Win32 Interoperation auf MSDN entschied ich mich dazu Gehe mit der Option XamlReader::Load
und lade zur Laufzeit unkompiliertes XAML. Mein XAML-Markup ist ein Canvas
UIElement
, das ich programmatisch als Kind meines root Grid
C ++ / CLI-Elements hinzufüge. Das funktioniert großartig.
Nun möchte ich Event-Handler zu den Steuerelementen in XAML hinzufügen. Hier habe ich angefangen, in Schwierigkeiten zu geraten. Ich bin mir sicher, dass meine allgemeine Unkenntnis der Windows-Welt 95% dessen ist, was mich hier umbringt.
Ich begann mit Rob Relyea Seite mit den verschiedenen XAML- und Event-Handler-Optionen .
Ich entschied mich, das XAML als C # DLL zu kompilieren. Es ist im Grunde das gleiche XAML wie das, was ich im Laufzeit-Lastfall verwendet habe. Ich instanziiere das Objekt und programmiere es als Kind wie zuvor. Aber ... ich bekomme nichts als ein schwarzes Fenster. Es werden auch keine Ausnahmen ausgelöst. Ich bin verwirrt.
Meine Frage ist, bin ich sogar auf dem richtigen Weg? Die Seite in XAML-und-Event-Handlern sagt, dass Sie Event-Handler in XAML in .Net Framework 4 definiert verwenden können. Sollte ich den sauren Apfel beißen und einfach zu VS 2010 gehen (ich bin derzeit auf VS 2008), so kann ich verwenden .Net Framework 4 und einfach bei nicht kompiliertem XAML bleiben? Gibt es irgendwelche Schwierigkeiten, die Dinge so zu machen?
Oder, wenn Sie denken, dass die kompilierte C # -DLL ein vernünftiger Pfad ist, haben Sie irgendwelche Ideen, wie ich die Probleme debuggen kann, die ich habe?
Oder gibt es einen besseren und völlig anderen Ansatz?
Vielen Dank im Voraus für Ihren Rat.
Polly
Ich denke, die richtige Antwort dafür hängt von einigen Problemen ab, die nur Sie selbst entscheiden können, aber ich gehe davon aus, dass Ihre C ++ - Codebasis groß und komplex genug ist, um sie zu erhalten.
Darüber hinaus ist der nächste Entscheidungspunkt, ob Sie UI-Code (möglicherweise GDI-Code) in C ++ haben, den Sie beibehalten oder nur den Code nicht verwenden möchten. Wenn Sie versuchen, nur Nicht-UI-Code beizubehalten, würde ich in Erwägung ziehen, mehr UI-Verantwortlichkeit in C # zu schieben. Vielleicht gehen Sie so weit, dass Sie Ihre Ansichten, Event-Handler erstellen und vielleicht sogar Modelle in C # ansehen. Dadurch können Sie die VS-Werkzeuge besser nutzen.
Wenn Sie umfangreichen UI-Code in C ++ haben, um zu konservieren, macht Ihr aktueller Pfad mehr Sinn. Ich denke nicht, dass es unmöglich sein wird, aber Sie werden eine ziemlich große Herausforderung vor sich haben. Das wichtigste Beispiel hier ist Visual Studio 2010. Es ist das erste Beispiel für eine gemischte Anwendung und hat GDI und WPF Seite an Seite wie keine andere App, die ich je gesehen oder gehört habe. Es gibt eine Reihe von Blog-Posts, die ich ziemlich interessant fand, die einige Aspekte beschreiben, die das Visual Studio-Team um diese Integration bei Das Visual Studio Blog .
Ich stieß auch auf dieses Video Henry Sowizral beim Reflektieren von C ++ mit WPF in Expression Design , das ich selbst nicht gesehen habe, sondern das Hinzufügen einer WPF-Benutzeroberfläche über eine vorhandene MFC C ++ - App diskutiert.
Viel Glück.
Ich habe keinen spezifischen Ratschlag zum ersten Teil Ihrer Frage, außer zu sagen, dass mehr Verantwortlichkeit in C # Ihnen erlauben würde, wenn nötig, eine kleine Stub-App zu erstellen, die einen großen Beitrag zur Diagnose von Problemen leisten könnte / p>
Danke an alle für die Antworten. Auf der Frage, in der C # -DLL stecken zu bleiben, fand ich dieses C ++ / CLI-Beispiel: Ссылка . Damit habe ich meinen Fehler gefunden und konnte den WPF ohne Probleme laden.
Die Motivation für das Laden der C # -DLL bestand jedoch darin, dass ich verstanden hatte, dass das die Art war, Ereignishandler programmatisch anzuhängen. Dem Vorschlag von AresAvatar folgend, fand ich, dass ich FindName verwenden konnte, um die Handler anzuhängen - beides innerhalb der C # -DLL, aber es funktionierte auch mit meinem ursprünglichen Loose-XAML-Ansatz. Also, ich brauchte die C # DLL nicht!
Alles funktioniert jetzt gut. Nochmals vielen Dank für Ihre Hilfe und Vorschläge.
Tags und Links wpf xaml c++-cli event-handling