Поделиться через


Пошаговое руководство: сопоставление свойств с помощью элемента WindowsFormsHost

Это пошаговое руководство описывает использование свойства PropertyMap для сопоставления свойств WPF соответствующим свойствам элемента управления Windows Forms.

В этом пошаговом руководстве демонстрируется выполнение следующих задач.

  • Создание проекта.

  • Определение макета приложения.

  • Определение нового сопоставления свойства.

  • Удаление сопоставления свойства по умолчанию.

  • Замена сопоставления свойства по умолчанию.

  • Расширение сопоставления свойства по умолчанию.

Полный пример кода для задач, приведенных в этом пошаговом руководстве, см. на веб-странице Mapping Properties Using the WindowsFormsHost Element Sample.

По окончании станет возможно сопоставлять свойства WPF соответствующим свойствам размещенных элементов управления Windows Forms.

Обязательные компоненты

Ниже приведены компоненты, необходимые для выполнения данного пошагового руководства.

  • Visual Studio 2008.

Создание проекта

Чтобы создать и настроить проект

  1. Создайте проект приложения WPF с именем PropertyMappingWithWfh.

  2. В обозревателе решений добавьте ссылку на сборку "WindowsFormsIntegration", которая называется WindowsFormsIntegration.dll.

  3. В обозревателе решений добавьте ссылку на сборки System.Drawing и System.Windows.Forms.

Определение макета приложения

Приложение на основе WPF использует элемент WindowsFormsHost для размещения элемента управления Windows Forms.

Чтобы определить макет приложения

  1. Откройте файл Window1.xaml в конструкторе сред. Конструктор WPF.

  2. Замените существующий код следующим кодом.

    <Window x:Class="PropertyMappingWithWfh.Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://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>
    
    <Window x:Class="Window1"
        xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="https://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. В редакторе кода откройте файл Window1.xaml.cs.

  4. В верхней части файла импортируйте следующие пространства имен.

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

Определение нового сопоставления свойства

Элемент WindowsFormsHost предоставляет несколько сопоставлений свойств по умолчанию. Добавьте новое сопоставление свойства путем вызова метода Add для PropertyMap элемента WindowsFormsHost.

Чтобы определить новое сопоставление свойства

  • Скопируйте следующий код в определение класса Window1.

    ' 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
    
    // 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) );
    }
    

    Метод AddClipMapping добавляет новое сопоставление для свойства Clip.

    Метод OnClipChange преобразует свойство Clip в свойство Windows Forms Region.

    Метод Window1_SizeChanged обрабатывает событие окна SizeChanged и изменяет размер области отсечения по размеру окна приложения.

Удаление сопоставления свойства по умолчанию

Удалите свойство сопоставления по умолчанию путем вызова метода Remove для PropertyMap элемента WindowsFormsHost.

Чтобы удалить сопоставление свойства по умолчанию

  • Скопируйте следующий код в определение класса Window1.

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

    Метод RemoveCursorMapping удаляет сопоставление по умолчанию для свойства Cursor.

Замена сопоставления свойства по умолчанию

Замените сопоставление свойства по умолчанию, удалив сопоставление по умолчанию и вызвав метод Add свойства PropertyMap элемента WindowsFormsHost.

Чтобы заменить сопоставление свойства по умолчанию

  • Скопируйте следующий код в определение класса Window1.

    ' 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
    
    // 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;
    }
    

    Метод ReplaceFlowDirectionMapping заменяет сопоставление по умолчанию для свойства FlowDirection.

    Метод OnFlowDirectionChange преобразует свойство FlowDirection в свойство Windows Forms RightToLeft.

    Метод cb_CheckedChanged обрабатывает событие CheckedChanged элемента управления CheckBox. Он присваивает значение свойству FlowDirection на основе значения свойства CheckState

Расширение сопоставления свойства по умолчанию

Можно использовать сопоставление свойства по умолчанию, а также расширить его с помощью собственного сопоставления.

Расширение сопоставления свойства по умолчанию

  • Скопируйте следующий код в определение класса Window1.

    ' 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
    
    // 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");
        }
    }
    

    Метод ExtendBackgroundMapping добавляет пользовательский преобразователь свойств к существующему сопоставлению свойства Background.

    Метод OnBackgroundChange присваивает определенное изображение свойству BackgroundImage размещенного элемента управления. Метод OnBackgroundChange вызывается после применения сопоставления свойства по умолчанию.

Инициализация сопоставлений свойств

Настройте сопоставления свойств с помощью вызова ранее описанных методов в обработчике событий Loaded.

Чтобы инициализировать сопоставления свойств

  1. Скопируйте следующий код в определение класса Window1.

    ' 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
    
    // 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();
    }
    

    Метод WindowLoaded обрабатывает событие Loaded и выполняет следующую инициализацию.

    • Создает элемент управления Windows Forms CheckBox.

    • Вызывает методы, ранее определенные в руководстве, для настройки сопоставлений свойств.

    • Назначение начальных значений сопоставленным свойствам.

  2. Нажмите клавишу F5 для построения и выполнения приложения. Установите флажок, чтобы увидеть эффект сопоставления FlowDirection. При установке данного флажка выполняется обращение ориентации макета слева направо.

См. также

Задачи

Пошаговое руководство. Размещение элемента управления Windows Forms в приложении WPF

Ссылки

WindowsFormsHost.PropertyMap

ElementHost.PropertyMap

WindowsFormsHost

Основные понятия

Сопоставление свойств Windows Forms и WPF

Другие ресурсы

Конструктор WPF