İzlenecek yol: WindowsFormsHost Öğesi Kullanarak Özellikleri Eşleme

Bu kılavuzda, WPF özelliklerini barındırılan bir Windows Forms denetiminde ilgili PropertyMap özelliklerle eşlemek için özelliğinin nasıl Windows gösterilir.

Bu kılavuzda gösterilen görevler şunlardır:

  • Projeyi oluşturma.

  • Uygulama düzenini tanımlama.

  • Yeni bir özellik eşlemesi tanımlama.

  • Varsayılan özellik eşlemesi kaldırılarak.

  • Varsayılan özellik eşlemesini değiştirme.

  • Varsayılan özellik eşlemesini genişletme.

Bitirdikten sonra, WPF özelliklerini barındırılan bir Windows Forms denetiminde karşılık gelen özelliklerle eşlersiniz.

Önkoşullar

Bu izlenecek yolu tamamlamak için aşağıdaki bileşenlere ihtiyacınız vardır:

  • Visual Studio 2017

Projeyi oluşturma ve ayarlama

  1. adlı bir WPF Uygulaması projesi oluşturun.

  2. Bu Çözüm Gezgini,WindowsFormsIntegration derlemesi için bir başvuru ekleyin ve bu derlemenin adı WindowsFormsIntegration.dll.

  3. Bu Çözüm Gezgini,System.Drawing ve System'e başvurular ekleyin. Windows. Derlemeleri oluşturur.

Uygulama Düzenini Tanımlama

WPF tabanlı uygulama, Windows WindowsFormsHost Forms denetimi barındırmak için öğesini kullanır.

Uygulama düzenini tanımlamak için

  1. WPF Tasarımcısı'nda Window1.xaml'i açın.

  2. Mevcut kodu aşağıdaki kodla değiştirin.

    <Window x:Class="PropertyMappingWithWfh.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="PropertyMappingWithWfh" Height="300" Width="300"
        Loaded="WindowLoaded">
      <DockPanel Name="panel1" LastChildFill="True">
        <WindowsFormsHost Name="wfHost" DockPanel.Dock="Left" SizeChanged="Window1_SizeChanged" FontSize="20" />
      </DockPanel>
    </Window>
    
  3. Kod Düzenleyicisi'nde Window1.xaml.cs'yi açın.

  4. Dosyanın en üstünde aşağıdaki ad alanlarını içeri aktarın.

    using System.Drawing;
    using System.Drawing.Drawing2D;
    using System.Windows.Forms;
    using System.Windows.Forms.Integration;
    
    Imports System.Drawing
    Imports System.Drawing.Drawing2D
    Imports System.Windows.Forms
    Imports System.Windows.Forms.Integration
    

Yeni Özellik Eşlemesi Tanımlama

öğesi WindowsFormsHost birkaç varsayılan özellik eşlemesi sağlar. öğesinin öğesinde yöntemini çağırarak Add yeni bir özellik WindowsFormsHost eşlemesi PropertyMap eklersiniz.

Yeni bir özellik eşlemesi tanımlamak için

  • Aşağıdaki kodu sınıfının tanımına Window1 kopyalayın.

    // The AddClipMapping method adds a custom
    // mapping for the Clip property.
    private void AddClipMapping()
    {
        wfHost.PropertyMap.Add(
            "Clip",
            new PropertyTranslator(OnClipChange));
    }
    
    // The OnClipChange method assigns an elliptical clipping
    // region to the hosted control's Region property.
    private void OnClipChange(object h, String propertyName, object value)
    {
        WindowsFormsHost host = h as WindowsFormsHost;
        System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox;
    
        if (cb != null)
        {
            cb.Region = this.CreateClipRegion();
        }
    }
    
    // The Window1_SizeChanged method handles the window's
    // SizeChanged event. It calls the OnClipChange method explicitly
    // to assign a new clipping region to the hosted control.
    private void Window1_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        this.OnClipChange(wfHost, "Clip", null);
    }
    
    // The CreateClipRegion method creates a Region from an
    // elliptical GraphicsPath.
    private Region CreateClipRegion()
    {
        GraphicsPath path = new GraphicsPath();
    
        path.StartFigure();
    
        path.AddEllipse(new System.Drawing.Rectangle(
            0,
            0,
            (int)wfHost.ActualWidth,
            (int)wfHost.ActualHeight ) );
    
        path.CloseFigure();
    
        return( new Region(path) );
    }
    
    ' The AddClipMapping method adds a custom mapping 
    ' for the Clip property.
    Private Sub AddClipMapping()
    
        wfHost.PropertyMap.Add( _
            "Clip", _
            New PropertyTranslator(AddressOf OnClipChange))
    
    End Sub
    
    ' The OnClipChange method assigns an elliptical clipping 
    ' region to the hosted control's Region property.
    Private Sub OnClipChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As WindowsFormsHost = h
    
        Dim cb As System.Windows.Forms.CheckBox = host.Child
    
        If cb IsNot Nothing Then
            cb.Region = Me.CreateClipRegion()
        End If
    
    End Sub
    
    ' The Window1_SizeChanged method handles the window's 
    ' SizeChanged event. It calls the OnClipChange method explicitly 
    ' to assign a new clipping region to the hosted control.
    Private Sub Window1_SizeChanged( _
    ByVal sender As Object, _
    ByVal e As SizeChangedEventArgs)
    
        Me.OnClipChange(wfHost, "Clip", Nothing)
    
    End Sub
    
    ' The CreateClipRegion method creates a Region from an
    ' elliptical GraphicsPath.
    Private Function CreateClipRegion() As [Region] 
        Dim path As New GraphicsPath()
        
        path.StartFigure()
        
        path.AddEllipse(New System.Drawing.Rectangle( _
            0, _
            0, _
            wfHost.ActualWidth, _
            wfHost.ActualHeight))
        
        path.CloseFigure()
        
        Return New [Region](path)
    
    End Function
    

    yöntemi AddClipMapping özelliği için yeni bir eşleme Clip ekler.

    yöntemi, OnClipChange özelliğini Clip Windows Forms özelliğine Region çevirir.

    yöntemi, Window1_SizeChanged pencerenin olayıyla başa SizeChanged çıkabilir ve kırpma bölgelerini uygulama penceresine sığacak şekilde boyutlar.

Varsayılan Özellik Eşlemesini Kaldırma

öğesinin öğesinde yöntemini Remove çağırarak varsayılan özellik WindowsFormsHost eşlemesini PropertyMap kaldırın.

Varsayılan özellik eşlemesini kaldırmak için

  • Aşağıdaki kodu sınıfının tanımına Window1 kopyalayın.

    // The RemoveCursorMapping method deletes the default
    // mapping for the Cursor property.
    private void RemoveCursorMapping()
    {
        wfHost.PropertyMap.Remove("Cursor");
    }
    
    ' The RemoveCursorMapping method deletes the default
    ' mapping for the Cursor property.
    Private Sub RemoveCursorMapping()
        wfHost.PropertyMap.Remove("Cursor")
    End Sub
    

    yöntemi RemoveCursorMapping özelliği için varsayılan eşlemeyi Cursor siler.

Varsayılan Özellik Eşlemesini Değiştirme

Varsayılan eşlemeyi kaldırarak ve öğesinin öğesinde yöntemini Add çağırarak varsayılan özellik WindowsFormsHost eşlemesini PropertyMap değiştirin.

Varsayılan özellik eşlemesini değiştirmek için

  • Aşağıdaki kodu sınıfının tanımına Window1 kopyalayın.

    // The ReplaceFlowDirectionMapping method replaces the
    // default mapping for the FlowDirection property.
    private void ReplaceFlowDirectionMapping()
    {
        wfHost.PropertyMap.Remove("FlowDirection");
    
        wfHost.PropertyMap.Add(
            "FlowDirection",
            new PropertyTranslator(OnFlowDirectionChange));
    }
    
    // The OnFlowDirectionChange method translates a
    // Windows Presentation Foundation FlowDirection value
    // to a Windows Forms RightToLeft value and assigns
    // the result to the hosted control's RightToLeft property.
    private void OnFlowDirectionChange(object h, String propertyName, object value)
    {
        WindowsFormsHost host = h as WindowsFormsHost;
        System.Windows.FlowDirection fd = (System.Windows.FlowDirection)value;
        System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox;
    
        cb.RightToLeft = (fd == System.Windows.FlowDirection.RightToLeft ) ?
            RightToLeft.Yes : RightToLeft.No;
    }
    
    // The cb_CheckedChanged method handles the hosted control's
    // CheckedChanged event. If the Checked property is true,
    // the flow direction is set to RightToLeft, otherwise it is
    // set to LeftToRight.
    private void cb_CheckedChanged(object sender, EventArgs e)
    {
        System.Windows.Forms.CheckBox cb = sender as System.Windows.Forms.CheckBox;
    
        wfHost.FlowDirection = ( cb.CheckState == CheckState.Checked ) ?
                System.Windows.FlowDirection.RightToLeft :
                System.Windows.FlowDirection.LeftToRight;
    }
    
    ' The ReplaceFlowDirectionMapping method replaces the
    ' default mapping for the FlowDirection property.
    Private Sub ReplaceFlowDirectionMapping()
    
        wfHost.PropertyMap.Remove("FlowDirection")
    
        wfHost.PropertyMap.Add( _
            "FlowDirection", _
            New PropertyTranslator(AddressOf OnFlowDirectionChange))
    End Sub
    
    
    ' The OnFlowDirectionChange method translates a 
    ' Windows Presentation Foundation FlowDirection value 
    ' to a Windows Forms RightToLeft value and assigns
    ' the result to the hosted control's RightToLeft property.
    Private Sub OnFlowDirectionChange( _
    ByVal h As Object, _
    ByVal propertyName As String, _
    ByVal value As Object)
    
        Dim host As WindowsFormsHost = h
    
        Dim fd As System.Windows.FlowDirection = _
            CType(value, System.Windows.FlowDirection)
    
        Dim cb As System.Windows.Forms.CheckBox = host.Child
    
        cb.RightToLeft = IIf(fd = System.Windows.FlowDirection.RightToLeft, _
            RightToLeft.Yes, _
            RightToLeft.No)
    
    End Sub
    
    
    ' The cb_CheckedChanged method handles the hosted control's
    ' CheckedChanged event. If the Checked property is true,
    ' the flow direction is set to RightToLeft, otherwise it is
    ' set to LeftToRight.
    Private Sub cb_CheckedChanged( _
    ByVal sender As Object, _
    ByVal e As EventArgs)
    
        Dim cb As System.Windows.Forms.CheckBox = sender
    
        wfHost.FlowDirection = IIf(cb.CheckState = CheckState.Checked, _
        System.Windows.FlowDirection.RightToLeft, _
        System.Windows.FlowDirection.LeftToRight)
    
    End Sub
    

    yöntemi, ReplaceFlowDirectionMapping özelliği için varsayılan eşlemenin yerini FlowDirection alır.

    yöntemi, OnFlowDirectionChange özelliğini FlowDirection Windows Forms özelliğine RightToLeft çevirir.

    cb_CheckedChangedyöntemi, CheckedChanged denetimde olayı CheckBox işler. Özelliğin FlowDirection değerine göre atar CheckState

Varsayılan Özellik Eşlemesini Genişletme

Varsayılan özellik eşlemesini kullanabilir ve kendi eşlemeniz ile genişletabilirsiniz.

Varsayılan özellik eşlemesini genişletmek için

  • Aşağıdaki kodu sınıfının tanımına Window1 kopyalayın.

    // The ExtendBackgroundMapping method adds a property
    // translator if a mapping already exists.
    private void ExtendBackgroundMapping()
    {
        if (wfHost.PropertyMap["Background"] != null)
        {
            wfHost.PropertyMap["Background"] += new PropertyTranslator(OnBackgroundChange);
        }
    }
    
    // The OnBackgroundChange method assigns a specific image
    // to the hosted control's BackgroundImage property.
    private void OnBackgroundChange(object h, String propertyName, object value)
    {
        WindowsFormsHost host = h as WindowsFormsHost;
        System.Windows.Forms.CheckBox cb = host.Child as System.Windows.Forms.CheckBox;
        ImageBrush b = value as ImageBrush;
    
        if (b != null)
        {
            cb.BackgroundImage = new System.Drawing.Bitmap(@"C:\WINDOWS\Santa Fe Stucco.bmp");
        }
    }
    
    ' The ExtendBackgroundMapping method adds a property
    ' translator if a mapping already exists.
    Private Sub ExtendBackgroundMapping() 
        If wfHost.PropertyMap("Background") IsNot Nothing Then
    
            wfHost.PropertyMap("Background") = PropertyTranslator.Combine( _
            wfHost.PropertyMap("Background"), _
            PropertyTranslator.CreateDelegate( _
                GetType(PropertyTranslator), _
                Me, _
                "OnBackgroundChange"))
        End If
    
    End Sub
    
    
    ' The OnBackgroundChange method assigns a specific image 
    ' to the hosted control's BackgroundImage property.
    Private Sub OnBackgroundChange(ByVal h As Object, ByVal propertyName As String, ByVal value As Object) 
        Dim host As WindowsFormsHost = h 
        Dim cb As System.Windows.Forms.CheckBox = host.Child 
        Dim b As ImageBrush = value 
        
        If Not (b Is Nothing) Then
            cb.BackgroundImage = New System.Drawing.Bitmap("C:\WINDOWS\Santa Fe Stucco.bmp")
        End If
    
    End Sub
    

    yöntemi, ExtendBackgroundMapping mevcut özellik eşlemesi için özel bir özellik Background çevirmeni ekler.

    yöntemi, OnBackgroundChange barındırılan denetimin özelliğine belirli bir görüntü BackgroundImage atar. Varsayılan OnBackgroundChange özellik eşlemesi uygulandıktan sonra yöntemi çağrılır.

Özellik Eşlemelerinizi Başlatma

Olay işleyicisinde daha önce açıklanan yöntemleri çağırarak özellik Loaded eşlemelerinizi ayarlayın.

Özellik eşlemelerinizi başlatmak için

  1. Aşağıdaki kodu sınıfının tanımına Window1 kopyalayın.

    // The WindowLoaded method handles the Loaded event.
    // It enables Windows Forms visual styles, creates
    // a Windows Forms checkbox control, and assigns the
    // control as the child of the WindowsFormsHost element.
    // This method also modifies property mappings on the
    // WindowsFormsHost element.
    private void WindowLoaded(object sender, RoutedEventArgs e)
    {
        System.Windows.Forms.Application.EnableVisualStyles();
    
        // Create a Windows Forms checkbox control and assign
        // it as the WindowsFormsHost element's child.
        System.Windows.Forms.CheckBox cb = new System.Windows.Forms.CheckBox();
        cb.Text = "Windows Forms checkbox";
        cb.Dock = DockStyle.Fill;
        cb.TextAlign = ContentAlignment.MiddleCenter;
        cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
        wfHost.Child = cb;
    
        // Replace the default mapping for the FlowDirection property.
        this.ReplaceFlowDirectionMapping();
    
        // Remove the mapping for the Cursor property.
        this.RemoveCursorMapping();
    
        // Add the mapping for the Clip property.
        this.AddClipMapping();
    
        // Add another mapping for the Background property.
        this.ExtendBackgroundMapping();
    
        // Cause the OnFlowDirectionChange delegate to be called.
        wfHost.FlowDirection = System.Windows.FlowDirection.LeftToRight;
    
        // Cause the OnClipChange delegate to be called.
        wfHost.Clip = new RectangleGeometry();
    
        // Cause the OnBackgroundChange delegate to be called.
        wfHost.Background = new ImageBrush();
    }
    
    ' The WindowLoaded method handles the Loaded event.
    ' It enables Windows Forms visual styles, creates 
    ' a Windows Forms checkbox control, and assigns the
    ' control as the child of the WindowsFormsHost element. 
    ' This method also modifies property mappings on the 
    ' WindowsFormsHost element.
    Private Sub WindowLoaded( _
    ByVal sender As Object, _
    ByVal e As RoutedEventArgs)
    
        System.Windows.Forms.Application.EnableVisualStyles()
    
        ' Create a Windows Forms checkbox control and assign 
        ' it as the WindowsFormsHost element's child.
        Dim cb As New System.Windows.Forms.CheckBox()
        cb.Text = "Windows Forms checkbox"
        cb.Dock = DockStyle.Fill
        cb.TextAlign = ContentAlignment.MiddleCenter
        AddHandler cb.CheckedChanged, AddressOf cb_CheckedChanged
        wfHost.Child = cb
    
        ' Replace the default mapping for the FlowDirection property.
        Me.ReplaceFlowDirectionMapping()
    
        ' Remove the mapping for the Cursor property.
        Me.RemoveCursorMapping()
    
        ' Add the mapping for the Clip property.
        Me.AddClipMapping()
    
        ' Add another mapping for the Background property.
        Me.ExtendBackgroundMapping()
    
        ' Cause the OnFlowDirectionChange delegate to be called.
        wfHost.FlowDirection = System.Windows.FlowDirection.LeftToRight
    
        ' Cause the OnClipChange delegate to be called.
        wfHost.Clip = New RectangleGeometry()
    
        ' Cause the OnBackgroundChange delegate to be called.
        wfHost.Background = New ImageBrush()
    
    End Sub
    

    yöntemi WindowLoaded olayı işler Loaded ve aşağıdaki başlatmayı gerçekleştirir.

    • Bir Windows Forms denetimi CheckBox oluşturur.

    • Özellik eşlemelerini ayarlamak için kılavuzda daha önce tanımlandığı yöntemleri çağırmaktadır.

    • Eşlenen özelliklere ilk değerleri atar.

  2. Uygulamayı derlemek ve çalıştırmak için F5 tuşuna basın. Eşlemenin etkisini görmek için onay kutusuna FlowDirection tıklayın. Onay kutusuna tıklarken düzen, sağ sol yönünü tersine çevirebilir.

Ayrıca bkz.