quang cao hosting

Kết hợp WPF và Windows Form

Xem: 4963    Tải: 0   Thảo luận: 0   Mục: HTML-CSS template   Lĩnh vực: Khác

0 điểm   ( 25 đánh giá ) File đã được kiểm thử

Thứ nhất, Windows Form là một công nghệ ra đời đã khá lâu và ổn định. Đa số các ứng dụng desktop hiện nay đều được xây dựng trên Windows Form. Trong khi đó, WPF chỉ mới xuất hiện được vài năm và nhiều lập trình viên vẫn quen thuộc với Windows Form hơn là WPF.

Thứ hai, WPF dù có nhiều ưu điểm nhưng vẫn chưa thực sự hoàn chỉnh. Một số tính năng của Windows Form (chẳng hạn một số loại control và hộp thoại) hiện vẫn chưa thể tìm thấy trong WPF. Trong những trường hợp đó, sử dụng lại các thành phần của Windows Form cho ứng dụng WPF (thay vì phát triển lại WPF control từ đầu) có thể sẽ là một tùy chọn đáng cân nhắc.

Từ những lý do trên, có thể thấy rằng Windows Form sẽ chưa biến mất ngay. Thay vào đó, các ứng dụng Windows Form có sẵn sẽ được nâng cấp từ từ sang WPF. Điều này làm nảy sinh nhu cầu kết hợp WPF và Windows Form trong cùng một chương trình. Thật may, cả hai công nghệ này có thể sống chung một cách khá dễ dàng! Bài viết này sẽ trình bày một số phương pháp để giải quyết vấn đề trên:

1. Đặt các WPF control và Windows Form control trong các cửa sổ riêng:

Đây là hướng tiếp cận đơn giản nhất, trong đó mỗi cửa sổ sẽ chỉ chứa một loại control (WPF control hoặc Windows Form control). Ta có thể thêm một cửa sổ Windows Form vào một ứng dụng WPF tương tự như đối với một ứng dụng Windows Form thông thường bằng cách click chuột phải vào tên project trong solution explorer, chọn Add -> New Item, sau đó chọn Windows Form trong Windows Form category, đặt tên và click Add.

Ngược lại, thêm một cửa sổ WPF vào một ứng dụng Windows Form hơi rắc rối hơn một chút vì Visual Studio không cung cấp tùy chọn này trong hộp thoại Add New Item. Tuy nhiên, ta có thể import một cửa sổ WPF có sẵn trong một project khác bằng cách chọn Add -> Existing Item và add cả hai file .xaml và .cs của cửa sổ đó. Với cách này, bạn sẽ phải tự add reference tới ba assembly sau: PresentationCore.dll, PresentationFramework.dll và WindowsBase.dll.

Visual Studio sẽ cung cấp môi trường làm việc phù hợp (trình thiết kế, intellisense…) cho mỗi loại cửa sổ. Bạn có thể thiết kế và biên dịch chương trình một cách tự nhiên như trong bất kì ứng dụng WPF hoặc Windows Form nào. Một lưu ý duy nhất là khi cần show một cửa sổ WPF ở dạng modeless từ trong một cửa sổ Windows Form (hoặc ngược lại), cần gọi phương thức EnableModelessKeyboardInterop (hoặc EnableWindowsFormInterop) để đảm bảo cửa sổ modeless có thể nhận keyboard input bình thường. Ví dụ trong trường hợp cửa sổ modeless WPF:

 

      MyWindow window = new MyWindow();
      ElementHost.EnableModelessKeyboardInterop(window);
      window.Show();

Bạn có thể sẽ cần add reference đến assembly WindowsFormIntegration.dll để sử dụng lớp ElementHost.

2. Đặt WPF control vào cửa sổ Windows Form:

Trong nhiều trường hợp chúng ta buộc phải sử dụng các WPF control và Windows Form control trong cùng một cửa sổ. Lớp ElementHost cho phép đặt các WPF control trong cửa sổ Windows Form. Chỉ cần tạo WPF control mong muốn và đặt nó vào trong ElementHost, sau đó thêm ElementHost vào tập các control của form.

       ElementHost host = new ElementHost();
       System.Windows.Controls.DatePicker wpfDatePicker = newSystem.Windows.Controls.DatePicker();

       host.Dock = DockStyle.Fill;
       host.Child = wpfDatePicker;
       this.Controls.Add(host);

3. Đặt Windows Form control vào cửa sổ WPF:
WPF cung cấp lớp WindowsFormHost có thể chứa một Windows Form control trong property Child. Ta có thể sử dụng lớp này theo kiểu khai báo trong XAML hoặc bằng lập trình:

                <Grid>
            <WindowsFormsHost>
                  <wf:TextBox x:Name="txtWinForm"/>
            </WindowsFormsHost>
      </Grid>

để sử dụng được tag <WindowsFormHost> như trên cần thêm dòng khai báo sau vào tag <Window>:

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

Còn đây là đoạn code để thêm Windows Form control vào cửa sổ WPF bằng C#:

     System.Windows.Forms.Integration.WindowsFormsHost host = newSystem.Windows.Forms.Integration.WindowsFormsHost();

            // Create the ListBox control.
     System.Windows.Forms.ListBox lstBox = new System.Windows.Forms.ListBox();
     lstBox.Items.Add("Item 1");
     lstBox.Items.Add("Item 2");

            // Assign the ListBox control as the host control's child.
     host.Child = lstBox;

            // Add the interop host control to the Grid
     this.MyGrid.Children.Add(host);

Nhớ rằng bạn cần Add Reference tới assembly System.Windows.Form và WindowsFormIntegration để đoạn code trên hoạt động.

4. Một vài hạn chế khi sử dụng WPF control và Windows Form control trong cùng một cửa sổ:

  1. Trong nhiều trường hợp, các control của Windows Form không thể thay đổi kích thước hoặc chỉ có thể thay đổi theo một chiều nhất định.
  2. Các control của Windows Form cũng không thể được xoay hoặc làm nghiêng. Nếu bị áp dụng các hiệu ứng này, WindowsFormHost sẽ phát sinh sự kiện LayoutError, và cuối cùng sẽ gây InvalidOperationException nếu không được xử lý.

Kết hợp WPF và Windows Form

Kết hợp WPF và Windows Form Đăng ngày 24-02-2014  WPF là công nghệ mới rất hấp dẫn đối với các nhà lập trình giao diện. So với Windows Form, WPF cung cấp nhiều tính năng đồ họa và multimedia vượt trội. Trong một ứng dụng lý tưởng, chúng ta có thể quên hẳn Windows Form để tập trung vào WPF. Tuy nhiên trong thực tế, Windows Form vẫn chưa chết. Vì sao? 5/10 4963

Thảo luận:

Để bình luận bạn phải đăng nhập thành viên.

File tương tự

Files cùng mục

 
File gợi ý cho bạn
File tải nhiều nhất
Megacode.vn - Thư viện mã nguồn chia sẻ, tải file cho cộng đồng
Copyright © 2013-2021. All rights reserved. Bản quyền thuộc VinaGon
Email: info@vinagon.com
Hotline: 086.924.3838