TOC

This article has been localized into German by the community.

Verschiedene Steuerelemente:

Das WindowsFormsHost Steuerelement

WPF und WinForms sind zwei verschiedene UI-Frameworks, beide von Microsoft erstellt. WinForms war das erste .NET UI-Framework, und WPF ist als eine modernere Alternative dazu gedacht. Um den Übergang zwischen den beiden zu erleichtern, hat Microsoft sichergestellt, dass WinForms-Steuerelemente weiterhin innerhalb einer WPF-Anwendung verwendet werden können. Dies geschieht mit dem WindowsFormsHost, den wir in diesem Artikel besprechen werden.

Um den WindowsFormsHost und die Steuerelemente von WinForms zu verwenden, müssen Sie einen Verweis auf die folgenden Assemblies in Ihrer Anwendung hinzufügen:

  • WindowsFormsIntegration
  • System.Windows.Forms

In Visual Studio geschieht dies, indem Sie mit der rechten Maustaste auf den Knoten "Referenzen"" (bzw. "References") in Ihrem Projekt klicken und "Referenz hinzufügen" (bzw. "Add reference") wählen:

In dem sich öffnenden Dialog sollten Sie "Assemblies" auswählen und dann die beiden Assemblies ankreuzen, die wir hinzufügen müssen:

Benutzung des WinForms WebBrowser Steuerelements

In einem früheren Artikel haben wir das WPF WebBrowser-Steuerelement verwendet, um einen kleinen Webbrowser zu erstellen. Wie in diesem Artikel erwähnt, ist das WPF WebBrowser-Steuerelement im Vergleich zur WinForms-Version jedoch etwas eingeschränkt. Es gibt viele Beispiele für Dinge, die mit der WinForms-Version einfach zu erledigen sind, die mit der WPF-Version schwieriger oder sogar unmöglich zu machen sind.

Ein kleines Beispiel ist die DocumentTitle-Eigenschaft und das entsprechende DocumentTitleChanged-Ereignis, das es einfach macht, den Titel des Fensters zu erhalten und zu aktualisieren, um ihn an den Titel der aktuellen Webseite anzupassen. Wir werden dies als Anlass benutzen, um die WinForms-Version direkt hier in unserer WPF-Anwendung zu testen:

<Window x:Class="WpfTutorialSamples.Misc_controls.WindowsFormsHostSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        Title="WindowsFormsHostSample" Height="350" Width="450">
    <Grid>
        <WindowsFormsHost Name="wfhSample">
            <WindowsFormsHost.Child>
                <wf:WebBrowser DocumentTitleChanged="wbWinForms_DocumentTitleChanged" />
            </WindowsFormsHost.Child>
        </WindowsFormsHost>
    </Grid>
</Window>
using System;
using System.Windows;

namespace WpfTutorialSamples.Misc_controls
{
	public partial class WindowsFormsHostSample : Window
	{
		public WindowsFormsHostSample()
		{
			InitializeComponent();
			(wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.wpf-tutorial.com");
		}

		private void wbWinForms_DocumentTitleChanged(object sender, EventArgs e)
		{
			this.Title = (sender as System.Windows.Forms.WebBrowser).DocumentTitle;
		}
	}
}

Achten Sie besonders auf die Zeile, in der wir den WinForms-Namensraum zum Fenster hinzufügen, damit wir darauf verweisen können:

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

Dies erlaubt es uns, WinForms-Steuerelemente mit dem Präfix wf: zu referenzieren.

Wie Sie sehen, ist der WindowsFormsHost ist ziemlich einfach zu bedienen. Es hat eine Child-Eigenschaft, in der Sie ein einzelnes WinForms-Steuerelement definieren können, ähnlich wie das WPF-Fenster nur ein einziges Root-Steuerelement enthält. Wenn Sie weitere Steuerelemente von WinForms in Ihrem WindowsFormsHost benötigen, können Sie das Panel-Steuerelement von WinForms oder eines der anderen Container-Steuerelemente verwenden.

Das WinForms WebBrowser-Steuerelement wird verwendet, indem auf die Assembly System.Windows.Forms mit dem wf-Präfix verwiesen wird, wie oben beschrieben.

Im Code-behind machen wir einen ersten Aufruf von Navigate, um eine sichtbare Webseite anstelle des leeren Controls beim Start zu haben. Wir behandeln dann das Ereignis DocumentTitleChanged, bei dem wir die Title-Eigenschaft des Fensters entsprechend dem aktuellen DocumentTitle-Wert des WebBrowser-Controls aktualisieren.

Gratuliere: Jetzt haben sie eine WPF-Applikation mit einem WinForms Webbrowser eingebettet darin.

Zusammenfassung

Wie Sie sehen können, ist die Verwendung von WinForms-Steuerelementen in Ihren WPF-Anwendungen ziemlich einfach, aber die Frage bleibt bestehen: Ist das eine gute Idee?

Im Allgemeinen sollten Sie es vermeiden. Es gibt eine Reihe von Problemen, die Ihre Anwendung beeinflussen können oder nicht (viele davon sind in diesem MSDN-Artikel beschrieben: http://msdn.microsoft.com/en-us/library/aa970911%28v=VS.100%29.aspx), aber ein ernsteres Problem ist, dass diese Art von UI-Framework-Mischung in zukünftigen Versionen des .NET-Frameworks möglicherweise nicht mehr unterstützt wird.

Am Ende liegt die Entscheidung jedoch bei Ihnen - brauchen Sie wirklich das WinForms-Control oder gibt es eine WPF-Alternative, die genauso gut funktionieren könnte?


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!