Sdílet prostřednictvím


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

Aktualisiert: November 2007

In dieser exemplarischen Vorgehensweise wird erläutert, wie Windows Presentation Foundation (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

Bb628679.alert_note(de-de,VS.90).gifHinweis:

Je nach aktivierten Einstellungen oder der verwendeten Version können sich die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen unterscheiden. Klicken Sie zum Ändern der Einstellungen im Menü Extras auf Einstellungen importieren und exportieren. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Vorbereitungsmaßnahmen

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

  • Visual Studio 2008.

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.

    In WPF-Designer wird die Datei Window1.xaml 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. Öffnen Sie VendorControl im Windows Forms-Designer.

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

  6. Legen Sie im Eigenschaftenfenster den Wert der Size-Eigenschaft auf 200.200 fest.

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

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

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

    Eigenschaft

    Wert

    Margin

    0,0,0,0

    ShowToday

    False:

  9. Legen Sie die Größe von VendorControl im Windows Forms-Designer auf die Größe des MonthCalendar-Steuerelements fest.

  10. Öffnen Sie die Datei VendorControl im Code-Editor.

  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 (Visual Basic).

  2. Öffnen Sie Window1.xaml im WPF-Designer.

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

    <Window x:Class="HostingMonthCalendar.Window1"
        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>
    
    <Window x:Class="HostingMonthCalendar.Window1"
        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>
    

    Ein Bereich, der das gehostete Windows Forms-Steuerelement darstellt, wird im Designer angezeigt. Wenn das Steuerelement nicht angezeigt wird, klicken Sie auf die Registerkarte Entwurf, um zur Entwurfsansicht zu wechseln.

  4. Wählen Sie im Menü Debuggen die Option Debuggen starten.

  5. 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 (Windows Presentation Foundation).

Siehe auch

Aufgaben

Exemplarische Vorgehensweise: Hosten eines Windows Forms-Steuerelements in Windows Presentation Foundation

Referenz

WindowsFormsHost

ElementHost

Weitere Ressourcen

Arbeiten mit Steuerelementen im WPF-Designer

Migration und Interoperabilität