TOC

This article is currently in the process of being translated into Vietnamese (~98% done).

Misc. controls:

The WindowsFormsHost control

WPF và WinForms là hai frameworks UI (giao diện người dùng) khác nhau, đều được tạo bởi Microsoft. WPF được tạo ra nhằm làm một bản thay thế hiện đại hơn WinForms, framework UI .NET đầu tiên. Để khiến việc chuyển giữa hai framework nhẹ nhàng hơn, Microsoft đã đảm bảo những điều khiển ở WinForms vẫn có thể được dùng trong một ứng dụng WPF. Điều này có thể đạt được nhờ sử dụng WindowsFormsHost, chúng ta sẽ bàn ngay sau đây.

Để sử dụng WindowsFormsHost và các điều khiển từ WinForms, ta cần thêm một tham chiếu tới những assembly sau trong chương trình của mình:

  • WindowsFormsIntegration
  • System.Windows.Forms

Trong Visual Studio, nhấp chuột phải vào nút "References" ở project của bạn và chọn mục "Add reference":

Trong hộp thoại vừa được mở ra, ta chọn "Assemblies" và rồi đánh dấu vào hai assembly cần thêm:

Sử dụng điều khiển WinForms WebBrowser

Trong bài trước, chúng ta dùng điều khiển WPF WebBrowser để tạo một trình duyệt web nhỏ. Tuy nhiên, như đã đề cập, điều khiển WPF WebBrowser khá bị giới hạn so với bên WinForms. Có nhiều thứ mà ta có thể làm dễ hơn bằng WinForms, mà có thể rất khó hoặc không thể làm được bằng WPF.

Một ví dụ nhỏ là với thuộc tính DocumentTitle và sự kiện DocumentTitleChanged tương ứng, rất dễ để ta lấy và cập nhật tiêu đề của cửa sổ cho tương ứng với tiêu đề của trang web. Coi như đây là một cái cớ để thử bản WinForms ngay trong ứng dụng WPF của chúng ta nhỉ:

<Window x:Class="WpfTutorialSamples.Misc_controls.WindowsFormsHostSample"
        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="WindowsFormsHostSample" Height="350" Width="450">
    <Grid>
        <WindowsFormsHost Name="wfhSample">
            <WindowsFormsHost.Child>
                <wf:WebBrowser DocumentTitleChanged="wbWinForms_DocumentTitleChanged" />
            </WindowsFormsHost.Child>
        </WindowsFormsHost>
    </Grid>
</Window>
using System;
using System.Windows;

namespace WpfTutorialSamples.Misc_controls
{
	public partial class WindowsFormsHostSample : Window
	{
		public WindowsFormsHostSample()
		{
			InitializeComponent();
			(wfhSample.Child as System.Windows.Forms.WebBrowser).Navigate("http://www.wpf-tutorial.com");
		}

		private void wbWinForms_DocumentTitleChanged(object sender, EventArgs e)
		{
			this.Title = (sender as System.Windows.Forms.WebBrowser).DocumentTitle;
		}
	}
}

Đặc biệt lưu ý dòng mà chúng ta thêm namespace WinForms vào cửa sổ, để từ đó ta có thể tham chiếu các điều khiển:

xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

Điều này cho phép ta tham chiếu các điều khiển WinForms qua tiền tố wf:

Như các bạn thấy, WindowsFormsHost khá dễ sử dụng. Nó có thuộc tính Child, trong đó ta có thể định nghĩa một điều khiển WinForms, giống như trong cửa sổ WPF chỉ chứa duy nhất một điều khiển gốc. Nếu bạn cần nhiều điều khiển từ WinForms trong WindowsFormsHost của bạn, bạn có thể sử dụng điều khiển Panel từ WinForms hay từ bất kì các điều khiển container nào.

Điều khiển WinForms WebBrowser được sử dụng để tham chiếu assembly System.Windows.Forms, sử dụng tiền tồ wf như đã giải thích ở trên.

Trong Code-behind, ban đầu chúng ta gọi Navigate, để có một trang web xem được thay vì điều khiển trống khi bắt đầu. Sau đó ta xử lý sự kiện DocumentTitleChanged, trong đó ta cập nhật thuộc tính Title của cửa sổ ứng với giá trị DocumentTitle hiện tại của điều khiển WebBrowser.

Chúc mừng, bạn đã hoàn thành một ứng dụng WPF sử dụng WinForms WebBrowser trong đó.

Kết luận

Như bạn đã thấy, sử dụng các điều khiển WinForms trong các ứng dụng WPF của bạn khá dễ, nhưng liệu nó có phải ý hay không?

Nhìn chung, ta muốn tránh sử dụng nó. Có một vài vấn đề có thể (hoặc không) ảnh hưởng tới ứng dụng của bạn (được đề cập và mô tả trong: http://msdn.microsoft.com/en-us/library/aa970911%28v=VS.100%29.aspx), nhưng một vấn đề nghiệm trọng hơn là kết hợp các framework UI kiểu này có thể không được hỗ trợ trong các bản cập nhật tiếp theo của .NET framework.

Nhưng cuối cùng thì lựa chọn vẫn là ở bạn - liệu bạn có thực sự cần điều khiển WinForms không hay là có một cách làm WPF nào đó cũng vẫn hoạt động?


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!