2009-06-16 8 views
0

Ich habe eine vorhandene WinForms-Anwendung, für die ich jetzt neue Bits in WPF entwerfe. Die Dinge laufen einigermaßen gut und ich bin auf mein erstes Bedürfnis nach einem Dialog gestoßen.WPF Interop & Dialoge

Ich möchte den Dialog in WPF tun. Es sieht so aus, als müsste ich ein UserControl für den eigentlichen Inhalt erstellen und diesen Inhalt dann über ein WinForms-Formular mit einem ElementHost hosten (da UserControl keine ShowDialog() -Methode hat).

Und das ist, wo meine Frage ist. Wie funktioniert das? Am besten kann ich sagen, das WPF UserControl hat nicht einmal eine DialogResult Eigenschaft (was sinnvoll ist, da es keine ShowDialog() Methode gibt) - es sieht so aus als würde ich ein WPF Window Control brauchen - und ich nicht Ich denke, ich kann das in diesem Fall benutzen.

Mit dem grundlegenden Fluss und Setup der Dinge hier zu kämpfen. Kann jemand ein Licht scheinen lassen?

Ist das überhaupt möglich?

Antwort

2

Sie können ein WPF-Fenster aus einer WinForms-Anwendung öffnen.

Erstellen Sie einfach das Fenster und rufen Sie ShowDialog(). Die CLR lädt das WPF-Framework und öffnet das Fenster.

+0

Es scheint, als ob dies jedoch ein separates Projekt erfordert, um das neue WPF-Fenster zu erstellen, da diese Option einfach nicht in der standardmäßigen VS WinForms-Projektvorlage angezeigt wird. Es funktioniert jedoch, sobald Sie das tun. Eine andere Sache ist, dass die ShowDialog() - Methode aus einem WPF-Fenster "bool" anstelle des granulareren DialogResult zurückgibt, das wir gewohnt sind (was natürlich sinnvoll ist, da es nichts über diese Klasse weiß). . Danke, Cameron. –

0

Wenn Sie möchten, dass Ihre Interop-Anwendung funktioniert meist wie eine WinForms App, dann funktioniert die von Ihnen beschriebene Vorgehensweise gut - ich habe so ziemlich das gleiche in meinen Interop Fällen.

WPF unterstützt MessageBoxen (obwohl eine etwas andere Version als WinForms), und Sie könnten etwas zusammenstellen, indem Sie WPF Windows verwenden (indem Sie etwas hinzufügen, das ähnlich zu DialogResult ist). Die bereitgestellten WPF-Steuerelemente weisen jedoch darauf hin, dass sie versuchen, UX-Interaktionen zu ändern, um insbesondere modale Dialoge zu minimieren.

Um das Leben einfacher zu machen, würde ich eine WinForms Form/ElementHost-Unterklasse speziell für den Umgang mit WPF-Inhalten erstellen, und je nachdem, wie sauber Sie Ihre "using" -Deklarationen, eigene Dialogresult-ähnliche Enumeration so umhüllen Sie müssen den System.Windows.Forms-Namespace nicht einschließen, der Ihre WPF-Code-Behinds mühsamer machen kann.

+0

Aber der Ansatz, den ich beschrieben habe, hat ein großes fehlendes Stück - das DialogResult. Woher kommt das? Kann ich irgendwie das WPF Window-Steuerelement verwenden? Wenn das so ist, wie? –

+0

DialogResult ist eine einfache Enumeration - es ist nicht schwer, eine ähnliche zu erstellen (oder System.Windows.MessageBoxResult wiederzuverwenden) und Unterklasse Window. Da der Kern Ihrer Anwendung jedoch WinForms ist, würde ich eine bestimmte Form-abgeleitete Klasse beibehalten, die mit einem eingebetteten ElementHost erstellt wurde, mit dem Sie WPF-Inhalt umschließen können. – micahtan