Share via


Exemplarische Vorgehensweise: Hosten eines Windows Forms-Steuerelements eines Drittanbieters in einer WPF-Anwendung

Aktualisiert: September 2010

In dieser exemplarischen Vorgehensweise wird erläutert, wie WPF Designer für Visual Studio zum Hosten eines Windows Forms-Steuerelements eines Drittanbieters in einer WPF-Anwendung verwendet werden kann. Weitere Informationen über Windows Forms und WPF-Interoperabilität finden Sie unter Migration und Interoperabilität.

In dieser exemplarischen Vorgehensweise verwenden Sie als Steuerelement eines Drittanbieters ein MonthCalendar-Steuerelement. Sie erstellen einen UserControl-Typ, der in seiner Controls-Auflistung eine Instanz des MonthCalendar-Steuerelements hat. Der UserControl-Typ macht eine Date-Eigenschaft verfügbar und implementiert benutzerdefinierte Logik, um das Verhalten des MonthCalendar-Steuerelements zu definieren. In der WPF-Anwendung wird ein TextBlock-Element an die Date-Eigenschaft gebunden.

Im Verlauf dieser exemplarischen Vorgehensweise führen Sie folgende Aufgaben aus:

  • Erzeugen des WPF-Projekts.

  • Erstellen eines Windows Forms-Benutzersteuerelements, um das Steuerelement des Drittanbieters zu kapseln.

  • Hosten des Windows Forms-Benutzersteuerelements in einer WPF-Anwendung.

Die folgende Abbildung zeigt, wie die Anwendung angezeigt wird.

Gehostetes Windows Forms-Steuerelement

Tipp

Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Arbeiten mit Einstellungen.

Vorbereitungsmaßnahmen

Zum Durchführen dieser exemplarischen Vorgehensweise benötigen Sie die folgenden Komponenten:

  • Visual Studio 2010.

Erstellen des WPF-Projekts

Der erste Schritt besteht darin, das WPF-Projekt für die Hostanwendung zu erstellen.

So erstellen Sie das Projekt

  1. Erstellen Sie ein neues WPF-Anwendungsprojekt in Visual Basic oder Visual C# mit dem Namen HostingMonthCalendar. Weitere Informationen finden Sie unter Gewusst wie: Erstellen eines neuen WPF-Anwendungsprojekts.

    Die Datei MainWindow.xaml wird im WPF-Designer geöffnet.

  2. Fügen Sie im Projektmappen-Explorer einen Verweis auf die WindowsFormsIntegration-Assembly mit dem Namen WindowsFormsIntegration.dll hinzu.

Erstellen des zusammengesetzten Windows Forms-Steuerelements

Diese Verfahrensweise zeigt, wie ein zusammengesetztes Steuerelement durch Ableitung eines Typs von der UserControl-Klasse erstellt wird.

So erstellen Sie das zusammengesetzte Windows Forms-Steuerelement

  1. Fügen Sie der Projektmappe ein neues Windows Forms-Steuerelementbibliothek-Projekt in Visual Basic oder Visual C# mit dem Namen VendorControlLibrary hinzu. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen und Entfernen von Projektmappenelementen.

    UserControl1 wird im Windows Forms-Designer geöffnet

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei UserControl1, und wählen Sie Umbenennen aus.

  3. Geben Sie dem Steuerelement den neuen Namen VendorControl. Wenn Sie gefragt werden, ob alle Verweise umbenannt werden sollen, klicken Sie auf Ja.

  4. Wählen Sie VendorControl auf der Entwurfsoberfläche aus.

  5. Legen Sie im Fenster Eigenschaften den Wert der Size-Eigenschaft auf 200.200 fest.

  6. Doppelklicken Sie in der Toolbox auf das MonthCalendar-Steuerelement.

    Auf der Entwurfsoberfläche wird ein MonthCalendar-Steuerelement angezeigt.

  7. Legen Sie im Fenster Eigenschaften folgende Eigenschaften für das MonthCalendar-Steuerelement fest.

    Eigenschaft

    Wert

    Margin

    0,0,0,0

    ShowToday

    False

  8. Legen Sie die Größe von "VendorControl" entsprechend der Größe des MonthCalendar-Steuerelements fest.

  9. Wählen Sie das MonthCalendar-Steuerelement aus.

  10. Klicken Sie im Eigenschaftenfenster auf die Registerkarte "Ereignisse", und doppelklicken Sie auf das Ereignis DateChanged.

    Die VendorControl-Datei wird im Code-Editor geöffnet, und ein Ereignishandler für das Ereignis DateChanged wird hinzugefügt.

  11. Ersetzen Sie den vorhandenen Code durch den folgenden Code. Dieser Code definiert eine Date-Eigenschaft und Logik, mit der die Datumsbereichseigenschaften des MonthCalendar-Steuerelements SelectionStart und SelectionEnd auf den Wert von TodayDate eingeschränkt werden. Der Code implementiert auch die INotifyPropertyChanged-Schnittstelle, die von der WPF-Datenbindung verwendet wird.

    Imports System
    Imports System.Collections.Generic
    Imports System.ComponentModel
    Imports System.Drawing
    Imports System.Data
    Imports System.Linq
    Imports System.Text
    Imports System.Windows.Forms
    
    Public Class VendorControl
        Inherits UserControl
        Implements INotifyPropertyChanged
    
        <Browsable(True)> _
        Public Property [Date]() As String
            Get
                Return Me.MonthCalendar1.TodayDate.ToShortDateString()
            End Get
    
            Set(ByVal value As String)
                If value <> Me.MonthCalendar1.TodayDate.ToShortDateString() Then
                    Dim newDate As DateTime = DateTime.Parse(value)
                    Me.SetDate(newDate)
                    Me.NotifyPropertyChanged("Date")
                End If
            End Set
        End Property
    
    
        Private Sub monthCalendar1_DateChanged( _
            ByVal sender As Object, ByVal e As DateRangeEventArgs) _
        Handles MonthCalendar1.DateChanged
            Me.SetDate(e.Start)
            Me.NotifyPropertyChanged("Date")
    
        End Sub
    
    
        Private Sub SetDate(ByVal [date] As DateTime)
            Me.MonthCalendar1.TodayDate = [date]
            Me.MonthCalendar1.SelectionStart = [date]
            Me.MonthCalendar1.SelectionEnd = [date]
    
        End Sub
    
    #Region "INotifyPropertyChanged Implementation"
    
        Public Event PropertyChanged As PropertyChangedEventHandler _
            Implements INotifyPropertyChanged.PropertyChanged
    
        Private Sub NotifyPropertyChanged(ByVal info As String)
            RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(info))
        End Sub
    
    #End Region
    End Class
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace VendorControlLibrary
    {
        public partial class VendorControl : UserControl, INotifyPropertyChanged
        {
            public VendorControl()
            {
                InitializeComponent();
            }
    
            [Browsable(true)]
            public string Date
            {
                get
                {
                    return this.monthCalendar1.TodayDate.ToShortDateString();
                }
    
                set
                {
                    if (value != this.monthCalendar1.TodayDate.ToShortDateString())
                    {
                        DateTime newDate = DateTime.Parse(value);
                        this.SetDate(newDate);
                        this.OnPropertyChanged("Date");
                    }
                }
            }
    
            private void monthCalendar1_DateChanged(object sender, DateRangeEventArgs e)
            {
                this.SetDate(e.Start);
                this.OnPropertyChanged("Date");
            }
    
            private void SetDate(DateTime date)
            {
                this.monthCalendar1.TodayDate = date;
                this.monthCalendar1.SelectionStart = date;
                this.monthCalendar1.SelectionEnd = date;
            }
    
            #region INotifyPropertyChanged Implementation
    
            public event PropertyChangedEventHandler PropertyChanged;
    
            private void OnPropertyChanged(string propertyName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
    
            #endregion
        }
    }
    
  12. Wählen Sie im Menü Erstellen die Option Projektmappe erstellen, um die Projektmappe zu erstellen.

Hosten des Windows Forms-Steuerelements in WPF

Das WindowsFormsHost-Element wird verwendet, um VendorControl in einer WPF-Anwendung zu hosten.

So hosten Sie das Windows Forms-Steuerelement in WPF

  1. Fügen Sie dem HostingMonthCalendar-Projekt im Projektmappen-Explorer einen Verweis auf das VendorControlLibrary-Projekt hinzu. Weitere Informationen finden Sie unter Gewusst wie: Hinzufügen oder Entfernen von Verweisen in Visual Studio.

  2. Öffnen Sie im WPF-Designer die Datei MainWindow.xaml.

  3. Ziehen Sie ein WindowsFormsHost-Steuerelement aus der Toolbox auf die Entwurfsoberfläche.

    Dem Projekt "HostingMonthCalendar" wird ein Verweis auf die WindowsFormsIntegration-Assembly hinzugefügt.

  4. Ersetzen Sie in der XAML-Ansicht das vorhandene Markup durch das folgende Markup. Dieser XAML-Code ordnet den VendorControlLibrary-Namespace und bindet ein TextBlock-Element an die Date-Eigenschaft von VendorControl.

    <Window x:Class="HostingMonthCalendar.MainWindow"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:v="clr-namespace:VendorControlLibrary;assembly=VendorControlLibrary"
        Title="Window1" Height="300" Width="300">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition />
            </Grid.RowDefinitions>
    
            <WindowsFormsHost Name="Host" Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center">
                <v:VendorControl Date="2/2/03" />
            </WindowsFormsHost>
    
            <TextBlock Grid.Row="1" 
                       Text="{Binding ElementName=Host, Path=Child.Date, Mode=OneWay, UpdateSourceTrigger=PropertyChanged }" 
                       HorizontalAlignment="Stretch" 
                       VerticalAlignment="Center" 
                       TextAlignment="Center" 
                       TextDecorations="None" 
                       FontSize="24" />
        </Grid>
    </Window>
    
  5. Wählen Sie im Menü Debuggen die Option Debuggen starten.

  6. Klicken Sie auf das MonthCalendar-Steuerelement, um das aktuelle Datum zu ändern. Das TextBlock-WPF-Element wird aktualisiert und zeigt das ausgewählte Datum an.

Nächste Schritte

  • Wenn Ihr Steuerelement überwiegend in einer WPF-Umgebung verwendet werden soll, können Sie eine eigene Klasse von WindowsFormsHost ableiten und die Date-Eigenschaft verfügbar machen. Dadurch können andere WPF-Steuerelemente direkt an die Date-Eigenschaft gebunden werden, ohne die Path=Child.Date-Syntax zu verwenden.

  • Sie können WPF-Steuerelemente auch in Windows Forms hosten. Weitere Informationen finden Sie unter Verwenden von WPF-Steuerelementen.

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Hosten eines Windows Forms-Steuerelements in WPF

Referenz

WindowsFormsHost

ElementHost

Weitere Ressourcen

Arbeiten mit Steuerelementen im WPF-Designer

Migration und Interoperabilität

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

September 2010

Fehlender Schritt wurde hinzugefügt.

Kundenfeedback.