TheDeveloperBlog.com

Home | Contact Us

CSharp | Java | Python | Swift | GO | WPF | Ruby | Scala | F# | JavaScript

WPF WindowsFormsHost Example

This WPF example uses the WindowsFormsHost control. It hosts a Windows Forms Button in a WPF Window.

WindowsFormsHost. Many controls based on Windows Forms exist.

We can use any of them in a WPF program with the WindowsFormsHost control. In it, we specify Windows Forms controls in XAML. Only one control can be nested in it.

Example. To start, please add a "xmlns wf" attribute to the Window element. The "wf" part is just a namespace we specify—other names can instead be used. Next, drag a WindowsFormsHost control to the application.

Tip: Try adding a Windows Forms control. All the classics you know and love are available—I used a Button.

Button

Note: You must prefix the Windows Forms control's name with the "wf" namespace. This is an XML syntax feature.

XML

I specified several attributes of the Windows Forms Button. Windows Forms does not use XAML in most programs, but within WPF it does. You can specify properties in the XAML instead of the properties window.

Example markup: XAML

<Window x:Class="WpfApplication19.MainWindow"
	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="MainWindow" Height="350" Width="525">
    <Grid>
	<WindowsFormsHost HorizontalAlignment="Left" Height="59" Margin="10,10,0,0"
			  VerticalAlignment="Top" Width="163">
	    <wf:Button Text="Button" Top="0" Left="0" Click="Button_Click"
		       BackColor="AliceBlue"
		       ForeColor="RosyBrown"
		       Font="Consolas"
		       FlatStyle="Flat"/>
	</WindowsFormsHost>
    </Grid>
</Window>

Example code: C#

using System;
using System.Windows;

namespace WpfApplication19
{
    public partial class MainWindow : Window
    {
	public MainWindow()
	{
	    InitializeComponent();
	}

	private void Button_Click(object sender, EventArgs e)
	{
	    // ... Cast as System.Windows.Forms.Button, not
	    //     System.Windows.Controls.Button.
	    System.Windows.Forms.Button b = sender as System.Windows.Forms.Button;
	    b.Text = "Clicked";
	}
    }
}

Only one Windows Forms control can be nested within the WindowsFormsHost. But this can be worked around by using a control such as TableLayoutPanel that can have sub-controls. In the example, I added a Click event handler.

TableLayoutPanel

So: When the user clicks on the oddly-colored Windows Forms Button, the Button_Click event handler runs.

And: The Text attribute of the Button is changed to the word "Clicked." This is not a WPF Button, which uses Content.

TextButton: WPF

Discussion. This article does not cover all the complexity of WindowsFormsHost. I leave most of that up to Microsoft (MSDN). It is thoughtful that Microsoft makes WPF programs support (to some extent) Windows Forms controls.

Use the WindowsFormsHost element to place a Windows Forms control within your WPF element or page.

WindowsFormsHost Class: MSDN

Summary. Based on my experiment with WindowsFormsHost, it seems that avoiding this element is an ideal choice. Using it introduces a lot of extra complexity. For example, the Button type has to be specified as one from Windows Forms.

However: In development, often ideal choices cannot be readily made. In those situations, WindowsFormsHost is a good option.