Chuyển từ Windows Forms sang WPF


113

Trong một thời gian dài, tôi đã bị mắc kẹt với việc phát triển Windows Forms (bắt đầu với VB6 và đã tiếp tục đến C # .NET 4.5) và tôi đã gặp khá nhiều giới hạn về những gì Windows Forms có thể làm, cả khi sử dụng .NET thuần túy và các hiệu ứng đặc biệt với Native Code.

Tôi đã cố gắng học WPF và XAML, nhưng tôi gặp khó khăn ngay tại nhà thiết kế mới của WPF. Nó thực sự có vẻ rất khó sử dụng so với trình thiết kế Windows Forms.

Tôi muốn biết liệu có bất kỳ lựa chọn thay thế nào cho trình thiết kế WPF của .NET, phù hợp hơn với các nhà phát triển Windows Forms không?


7
Tôi thường thậm chí không sử dụng trình thiết kế, tiết kiệm để kiểm tra xem bố cục tổng thể có như những gì tôi mong đợi hay không; cuối cùng, tôi viết mọi thứ bằng tay trong XAML và / hoặc sử dụng Blend khi cần - mặc dù tôi không phải là nhà thiết kế nên điều đó hầu như không bao giờ xảy ra.
Patryk Ćwiek

Bạn có thể sử dụng pha trộn Biểu thức, nhưng tôi không nghĩ điều đó thực sự dễ dàng hơn, nó dành cho các nhà thiết kế hơn là các nhà phát triển IMO. Tôi thường chỉ tắt xem trước và làm việc với xml.
BlackICE

5
Nó không khó để sử dụng, chỉ đơn giản là bạn chưa quen. Rào cản lớn nhất cần vượt qua là sự thay đổi mô hình giữa hai công nghệ. Hãy kiếm cho mình một cuốn sách hay về XAML, khi bạn đã quen với XAML, bạn thậm chí sẽ không sử dụng trình thiết kế nữa - bạn sẽ gõ trực tiếp XAML.
slugster,

3
@slugster, tôi đã tự hỏi về điều đó. Điều tương tự cũng xảy ra với HTML ... Tôi sử dụng để xây dựng giao diện người dùng với dreamweaver, và bây giờ tôi mã HTML bằng tay
Matthew Layton

Câu trả lời:


175

Tôi thích viết blog về các bài báo dành cho người mới bắt đầu về WPF và có một số bài cụ thể có thể giúp bạn:

Tóm lại, sự khác biệt lớn nhất giữa Winforms và WPF là trong WPF lớp dữ liệu của bạn (sự DataContext) là ứng dụng của bạn, trong khi trong Winforms lớp giao diện người dùng là ứng dụng của bạn.

Để nhìn nó theo cách khác, với WPF, ứng dụng của bạn bao gồm các đối tượng bạn tạo và bạn sử dụng Mẫu và các đối tượng giao diện người dùng khác để cho WPF biết cách vẽ các thành phần ứng dụng của bạn.

Điều đó ngược lại với WinForms nơi bạn xây dựng ứng dụng của mình từ các đối tượng UI, sau đó cung cấp cho chúng dữ liệu cần thiết.

Bởi vì điều này, trình thiết kế thực sự không được sử dụng nhiều vì các thành phần ứng dụng của bạn được thiết kế bằng mã và trình thiết kế chỉ cần thiết để vẽ một giao diện thân thiện với người dùng phản ánh các lớp dữ liệu của bạn (thường ModelsViewModels)

Và cá nhân tôi, tôi thích nhập tất cả XAML của mình ra bằng tay vì nó nhanh hơn và không gây rối như trình thiết kế WPF kéo / thả, mặc dù thỉnh thoảng tôi sử dụng Trình thiết kế để xem trước giao diện người dùng của mình. giống.

Vì vậy, để trả lời câu hỏi của bạn về việc liệu có các nhà thiết kế WPF khác phù hợp với các nhà phát triển WinForms hay không, tôi khuyên bạn nên thay vì tìm kiếm một nhà thiết kế khác, thay vào đó hãy tìm hiểu cách sử dụng WPF theo cách nó được sử dụng. Sử dụng WPF giống như WinForms có nghĩa là bạn bỏ lỡ nhiều điều khiến nó trở nên tuyệt vời :)


14
Hoàn toàn đồng ý với @Rachel. Nhận thức quan trọng nhất khi hiểu về WPF là hiểu rằng UI không phải là Dữ liệu và hành động theo đó.
Federico Berasategui

2
@Rachel - chỉ để đóng vai người ủng hộ ma quỷ: Bắt đầu với giao diện người dùng (các nút, hộp văn bản, v.v. xuất hiện trong cửa sổ) giúp ứng dụng tập trung vào những gì bạn muốn làm. Phần còn lại chỉ là chi tiết thực hiện về cách bạn muốn thực hiện.
Asaf

3
@HighCore hãy xem stackoverflow.com/questions/982978/mvvm-for-winforms và bạn sẽ phải thừa nhận rằng Winforms chỉ là một thành phần View / UI trong đó các đối tượng nghiệp vụ có thể bị ràng buộc bởi các điều khiển của người dùng. Được rồi: WPF phù hợp hơn với MVVM nhưng tuy nhiên Winforms cũng có thể hoạt động trong Design Pattern như vậy. Và như Rachel nói "Điều đó ngược lại với WinForms, nơi bạn xây dựng ứng dụng của mình từ các đối tượng giao diện người dùng và sau đó cung cấp cho chúng dữ liệu cần thiết." Mặc dù vậy, nó không đúng sự thật. Tôi luôn nghĩ theo cách ít nhất là Dữ liệu và Chế độ xem. Dữ liệu và Winforms / WPF / HTML bất cứ điều gì.
Bernoulli IT

2
Nó hỗ trợ dữ liệu ít nhất ở cấp độ Nhập / sửa đổi dữ liệu. Và 99,9999999% nhà phát triển đó cũng sẽ gây rối trong WPF mà tôi nghi ngờ. Nhưng chúng ta hãy kết thúc cuộc thảo luận này. WPF hoàn toàn mạnh mẽ hơn / phù hợp với MVVM và tách biệt các mối quan tâm nhưng tôi nghĩ bạn và Rachel cũng đẩy Winforms vào một góc tiêu cực. Đặc biệt là khi bạn tiếp tục sử dụng những từ bạn sử dụng ...
Bernoulli CNTT

3
@YoupTube Bạn nói đúng, Winforms hỗ trợ liên kết dữ liệu và bạn có thể tạo liên kết tùy chỉnh của riêng mình cho các trường hợp mà hệ thống liên kết mặc định cũng không hoạt động. Mặc dù vậy, tôi đã viết câu trả lời này và các bài viết trên blog của mình với những người mới bắt đầu và người mới bắt đầu thường nghĩ về các thành phần giao diện người dùng chứ không phải đối tượng dữ liệu. Ngoài ra, ràng buộc trong WinForms không phải lúc nào cũng tồn tại ở trạng thái hiện tại, vì vậy nhiều nhà phát triển lớn lên với WinForms hoặc những người đã quen với các công nghệ khác không sử dụng ràng buộc, thường sẽ không xác định được sự khác biệt chính này khi chuyển đổi đến một kiến ​​trúc ràng buộc. :)
Rachel

9

Mặc dù vậy, một số người không đồng ý, tôi cũng khuyên bạn không nên sử dụng VS designer. Ít nhất là không phải tạo giao diện. Nếu bạn có thể muốn có ấn tượng đầu tiên về việc triển khai của mình mà không cần khởi động ứng dụng, đó là một người xem tốt ít nhất là miễn là không có những thứ phức tạp như StylesTemplatesđược sử dụng. Nhưng, IMHO, kết quả kéo và thả của nó chỉ nên được sử dụng làm nguyên mẫu và do đó sẽ bị loại bỏ sau khi không còn cần thiết nữa.

Đây là một số lý do quan trọng để tôi không sử dụng nó.

  1. VS designer đang làm việc với việc sửa chữa lề và căn chỉnh (thường là không cần thiết, nếu bạn đang sử dụng các điều khiển bố cục), có nghĩa là bạn phải chạm vào nhiều điều khiển, nếu các yêu cầu được thay đổi. Nếu bạn hiểu sâu về XAML và cơ chế WPF, bạn có thể tạo một ứng dụng có thể được sửa đổi với nỗ lực nhỏ, về giao diện.

  2. Vì nhà thiết kế đang tạo xaml, bố cục không tối ưu và giao diện người dùng có thể hoạt động kém. Tôi không đo lường nó, đó chỉ là cảm giác.

Một thay thế tốt hơn nhiều là MS Blend , mặc dù khởi đầu là mọi thứ khác nhưng dễ dàng. Kết quả kéo và thả của nó tốt hơn nhiều so với kết quả của VS designer.
Nhưng nó là một công cụ khá mạnh mẽ, giúp bạn sử dụng các yếu tố khá mạnh mẽ để tạo ra một giao diện người dùng hiện đại. Tôi khuyên bạn nên ghé thăm ít nhất một hội thảo ngắn hạn để biết được cơ hội của nó.

Trở lại câu hỏi của bạn, IMHO, và tôi nghĩ nhiều người cũng đồng ý, hãy tìm cho mình một cuốn sách hay, ví dụ như WPF Unleashed và sau này, nếu bạn muốn biết thêm về chi tiết, WPF Pro . Có rất nhiều tính năng khác nhau Winforms. Bạn sẽ không biết chúng bằng cách sử dụng bất kỳ nhà thiết kế nào. Tôi nghĩ đó là cách tiếp cận tốt nhất.

Cũng xin vui lòng xem xét rằng có rất nhiều khung và thư viện (ví dụ: MVVM light , WPFToolkit ) hiện đang giải quyết một số vấn đề phổ biến. Vì vậy, không cần thiết phải phát minh lại bánh xe.


9

Tôi biết đây là một câu hỏi cũ nhưng vì lợi ích của bất kỳ ai khác đang xem xét vấn đề này, tôi nghĩ tôi nên cân bằng lại một chút - đọc một số câu trả lời khác, tôi có cảm giác rằng một số câu trả lời 'không sử dụng trình thiết kế 'tình cảm đến từ việc không sử dụng nó đúng cách. Hướng dẫn này khá tốt để giúp bạn thực hiện và trả lời một số lời chỉ trích trong các bài viết khác.

Ví dụ: bạn có thể chuyển từ bố cục dựa trên lề giống Winforms là mặc định khi bạn thả điều khiển, sang kiểu WPF-ish hơn bằng cách nhấp chuột phải và chọn 'Đặt lại bố cục'

Video này bao gồm mặt bằng tương tự.

Tôi vẫn thích trình thiết kế VS2010 hơn - VS2013 có vẻ hơi lỗi khi kéo và thả vào TabItems **, (mà dự án hiện tại của tôi sử dụng rất nhiều) - nhưng chế độ xem Sơ lược tài liệu VS2013 cho phép bạn di chuyển mọi thứ xung quanh trong chế độ xem đó , đó có thể là một điểm cộng thực sự.

Thực sự, mặc dù vậy, để tận dụng tối đa WPF và xaml, bạn cần phải thông thạo một cách hợp lý cả chế độ xem của nhà thiết kế và chế độ xem xaml và chuyển đổi giữa chúng; nếu bạn né tránh nhà thiết kế, bạn đang bỏ lỡ một thứ có thể giúp ích cho bạn rất nhiều.

** Chỉnh sửa - mặc dù điều này dường như đã được cải thiện trong Bản cập nhật 3 cho VS 2013 và trong các bản xem trước của VS14, cho đến nay, đôi khi tôi vẫn nhận được hành vi kỳ lạ.


7

Trước hết, trong WPF (XAML) trong Visual Studio deisgner, bạn nên luôn sử dụng mã xaml để xây dựng giao diện người dùng của bạn và không kéo và thả bạn kiểm soát! Bạn cần giữ mã của mình sạch sẽ. Bạn có thể sử dụng Expression Blend để giúp bạn, nó được định hướng đồ họa nhiều hơn với tính năng kéo và thả, nhưng nó không miễn phí.

Nó không phải là một đường cong học tập lớn, nhưng tôi nghĩ bạn nên học cách làm xaml của mình bằng tay thay vì tìm kiếm phương pháp thay thế.


1
Kéo-n-thả không có hại, mặc dù nếu bạn thích nhập, điều đó cũng tốt. Nhập thủ công không bao giờ là chìa khóa cho WPF.
David

3
Khi bạn kéo và thả trong WPF, tôi thường thấy rằng bạn có rất nhiều lợi nhuận là -1200 và những thứ như vậy chẳng có ý nghĩa gì cả ... Tôi luôn làm điều đó bằng tay chắc chắn là tốt hơn
mlemay

1
Đây là chủ đề. Đảm bảo rằng vấn đề của bạn là chung cho tất cả, không chỉ riêng bạn. Ngoài ra, bạn không thể nói kéo-n-thả là xấu, nếu bạn gặp một số vấn đề. Việc dựa vào nhà thiết kế vẫn cần thiết và đôi khi được ưu ái, bạn có thể thấy điều này đúng, nếu bạn biết cách thể hiện được cả nhà thiết kế và nhà phát triển hoan nghênh.
David

1
vâng nếu bạn sử dụng sự pha trộn biểu cảm, ok bạn có thể làm điều đó, nhưng tôi đang nói chuyện trong studio trực quan ...
mlemay

12
Tôi nghĩ rằng việc khuyên ai đó đến từ Forms và bắt đầu WPF không sử dụng trình thiết kế là một ý tưởng thực sự tồi. Cách nhanh nhất để hiểu XAML là sử dụng kéo và thả rồi quan sát mã.
Ucodia

7

Tôi đã trải qua quá trình này như bạn đã làm. Sau đó, tôi đã dạy mọi người trong công ty WPF của tôi. Có một vài bài học quan trọng mà tôi đã học được và tất cả những người tôi biết làm việc với WPF.

  1. Nếu bạn đang làm việc với các điều khiển giao diện người dùng trong đoạn mã đằng sau, .... Thì bạn đang làm sai. Bạn hoàn toàn không cần phải xử lý các điều khiển giao diện người dùng trong mã phía sau.
  2. Bạn không cần nhà phát triển trực quan để nhấp vào nó. Bạn có năng suất cao hơn nhiều khi chỉ giao dịch với XAML. Sử dụng Sao chép / Dán. Không tin tưởng vào khả năng đánh máy của bạn. Nó sẽ tiết kiệm rất nhiều đau đầu.
  3. Hãy coi XAML giống như một cửa sổ lưu dữ liệu. Trong đoạn mã đằng sau bạn đang thay đổi dữ liệu. Trong XAML, bạn đang xác định cách giao diện người dùng sẽ diễn giải dữ liệu.
  4. Bộ chuyển đổi thật tuyệt vời. Ngay sau khi bạn nhận được một lượng Converters quan trọng, năng suất của bạn sẽ tăng vọt. Họ sẽ đảm nhận vai trò của một lượng lớn các trình xử lý sự kiện điều khiển ẩn hoặc thay đổi kích thước, hoặc những gì về giao diện người dùng,

Nó làm cho việc phát triển giao diện người dùng trở nên thú vị. Đặc biệt là khi bạn tìm ra cách nó thích chơi cùng với các quy trình Asyc. Nó thực sự giúp loại bỏ rất nhiều vấn đề đau đầu do Winforms gây ra.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.