2012-06-28 30 views
30

Tôi đã đọc một số giải thích về sự khác biệt giữa người dùng và Tuỳ chỉnh Controls, ví dụ này: http://www.wpftutorial.net/CustomVsUserControl.htmlTuỳ chỉnh vs kiểm soát tài

Tôi muốn tạo ra, ví dụ, một thành phần đơn giản của một DataGrid với 2 comboboxes có trách nhiệm thay đổi các giá trị từ các mục của datagrid. Tôi muốn tạo ra một điều khiển cụ thể cho điều này bởi vì tôi sẽ sử dụng nó rất nhiều lần. Tôi muốn thực hiện logic đằng sau và sau đó trong lời gọi xaml tôi chỉ phải chỉ định itemsSource.

Ví dụ này, tôi có nên tạo điều khiển Người dùng hoặc Tùy chỉnh không? Vì tôi sẽ có các thuộc tính và logic, nên tôi có một viewmodel cho điều khiển này?

EDIT: Bạn có biết một số bài viết có phân tách khái niệm rõ ràng giữa 2 tùy chọn này không?

+0

Theo như tôi biết, điều khiển tùy chỉnh chỉ là các điều khiển người dùng được biên dịch (hoặc kiểm soát cơ bản) –

+0

@DavidBrunelle chắc chắn là không. Việc xử lý khác nhau của Mẫu nên đã làm rõ điều đó. Ngoài ra một UserControl không thể có một phong cách, đó là tầm quan trọng sống còn đối với hầu như tất cả các điều khiển tùy chỉnh. – dowhilefor

Trả lời

65

Lựa chọn không chỉ giữa điều khiển người dùng và điều khiển tùy chỉnh mà còn giữa kiểm soát người dùng, điều khiển tùy chỉnh, tùy chỉnh mẫu kiểm soát, tùy chỉnh mẫu dữ liệu, mẫu tiêu đề (cho bộ sưu tập dựa trên điều khiển), thuộc tính đính kèm. Tham khảo Control Authoring overview

tôi đi theo lệnh sau xem xét

  1. Attached Properties: Nếu chức năng có thể đạt được, tôi sử dụng tài sản gắn liền. Ví dụ, hộp văn bản số.

  2. Mẫu kiểm soát: Khi yêu cầu có thể được thực hiện bằng cách tùy chỉnh mẫu kiểm soát, tôi sử dụng mẫu này. Ví dụ, thanh tiến trình tròn.

  3. Điều khiển tùy chỉnh: Nếu mẫu kiểm soát không thể thực hiện được, tôi sử dụng điều khiển tùy chỉnh. Miễn là tôi cần phải tùy chỉnh/mở rộng kiểm soát hiện tại.Ví dụ cung cấp Sắp xếp, Lọc dựa trên hàng tiêu đề trong GridView (GridView có trong ứng dụng metro, được sử dụng chỉ để minh họa ví dụ)

  4. Điều khiển người dùng: Ít nhất được ưu tiên. Chỉ khi thành phần được yêu cầu, và tôi không thể làm điều đó bằng cách sử dụng điều khiển tùy chỉnh. Giống như trong ví dụ của bạn, 2 Combobox và 1 datagrid. Các điều khiển người dùng không cung cấp tính năng không nhìn liền mạch có thể được tận dụng thông qua mẫu điều khiển hoặc kiểm soát tùy chỉnh.

+2

+1 Tuyệt vời, tôi sẽ chuyển CustomControl và UserControl, nhưng nếu không thì đó chính xác như thế nào bạn nên xem xét làm thế nào để thực hiện logic tùy chỉnh của bạn. Trong thực tế, tôi luôn thấy CustomControl là tùy chọn cuối cùng có thể và yêu thích thực hiện các tác vụ bằng cách sử dụng Hành vi được đính kèm. – dowhilefor

+0

hành vi không có gì là điều khiến tôi tránh xa sự kiểm soát của người dùng. – Tilak

+0

i too love Các hành vi được đính kèm. Họ làm cho mã sạch hơn, nhưng cùng một lúc, tôi không thích sử dụng quá mức, nơi tài sản kèm theo là đủ, và donot đòi hỏi nhiều đường ống dẫn nước – Tilak

-1

Vâng để tạo điều khiển Tùy chỉnh, bạn cần triển khai điều khiển này dưới dạng Kiểm soát của người dùng. Điều khiển người dùng của riêng bạn được gọi là Kiểm soát tùy chỉnh. Nó khá đơn giản.

UserControl là lớp cơ sở để chứa nội dung tùy chỉnh của bạn:

<UserControl> 
    Your custom WPF content 
</UserControl> 

Tôi không hoàn toàn đồng ý với bài viết. Tuy nhiên trong trường hợp của bạn, bạn cần một UserControl mà bạn có thể tái sử dụng sau này trong giao diện người dùng của bạn.

+0

cảm ơn phản hồi nhanh. Và làm thế nào về tùy chọn viewmodel? Tôi muốn có được XAML càng đơn giản càng tốt, và tôi đã suy nghĩ chỉ để có một tài sản công cộng sẽ nhận được một ID sẽ được sử dụng nội bộ để thực hiện một số cuộc gọi đến lớp kinh doanh để lấy dữ liệu. Đối với tình huống này nó có ý nghĩa với tôi để có một viewmodel, nhưng tôi không biết nếu tôi sẽ mất quyền lực reutilization. – Louro

+0

@MBen xin lỗi tôi có thể không hiểu câu đầu tiên của bạn nhưng "Để tạo một tùy chỉnh contrl nhu cầu của bạn để thực hiện nó như là một điều khiển người dùng", điều này là đồng bằng sai CustomControl không có gì để làm với một UserControl, trên thực tế bạn có thể viết một ứng dụng khổng lồ mà không cần bất kỳ UserControls nào. Ngoài ra "UserControl của bạn được gọi là một điều khiển tùy chỉnh" thats cũng sai, một UserControl không phải là một CustomControl theo nghĩa ban đầu, subclassing một WPF Control, hoặc CustomControls khác của bạn được gọi là CustomControl. – dowhilefor

+0

@dowhilefor Tôi đồng ý với bạn. Tuy nhiên đối với tôi, Custom Control là một kiểm soát được xây dựng sẵn sẽ được các nhà phát triển khác sử dụng lại. Nếu tôi hiểu rõ thì đây là trường hợp của Louro. Tôi đồng ý với bạn, bạn có thể xây dựng một ứng dụng khổng lồ mà không cần sử dụng UserControl.UserControl được sử dụng khi đặc biệt bạn muốn trở thành một phần của giao diện người dùng có thể tái sử dụng. – MBen

0

Nếu đây là lần đầu tiên bạn kiểm soát việc xây dựng, tôi khuyên UserControl là VS cho phép bạn thiết kế giao diện dễ dàng hơn. Điều khiển tùy chỉnh mạnh mẽ hơn, nhưng bạn phải R CLE RÀNG tách biệt logic điều khiển khỏi giao diện của nó và điều này đòi hỏi phải chuẩn bị nhiều hơn một chút.

6

Giải thích tốt nhất là ở số msdn. CustomControl là một tên "ảo", không có lớp được gọi là "CustomControl" trong WPF, thay vào đó nó có nghĩa là tạo một lớp mới trên đầu trang của một trong các lớp điều khiển WPF, như Control, ItemsControl và các điều khiển cụ thể hơn như TextBox hoặc Button .

Đối với trường hợp cụ thể của bạn, UserControl là đủ, việc tạo CustomControl là một thứ có thể dễ dàng tránh được. Trong khi nó không phải là một điều xấu, rất nhiều người, đặc biệt là người mới bắt đầu trong WPF đến từ WinForms có xu hướng phân lớp nhiều hơn sau đó cần thiết.

25

Bạn đã có một số câu trả lời tuyệt vời mà giải thích sự khác biệt nhưng cũng hiểu rằng điều khiển tùy chỉnh và UserControls có mục đích khác nhau:

Một UserControl thường encapusulates một số loại hành vi composite. Ví dụ: nếu bạn có ứng dụng cần chỉnh sửa chi tiết liên hệ ở nhiều nơi, bạn có thể tạo điều khiển tùy chỉnh có nhãn và trường văn bản cho tất cả dữ liệu được trình bày bằng nút gửi có mã có liên quan và sử dụng lại điều khiển này trong suốt ứng dụng của bạn.

Điều khiển tùy chỉnh là điều khiển bắt nguồn từ một trong các lớp kiểm soát WPF (E.G. Control, ContentControl v.v.) và phải được tạo bằng mã. Những kiểm soát này thường có một mục đích cố kết duy nhất (nghĩ TextBox, ComboBox, Label) thay vì hành động chung với nhau (mặc dù điều này không phải là trường hợp).

UserControl thường dễ dàng hơn cho những người không quen thuộc với WPF vì chúng có thể được thiết kế trực quan.

Đề xuất của tôi sẽ bắt đầu bằng một số UserControl. Bạn luôn có thể cấu trúc lại điều này thành một điều khiển tùy chỉnh vào một ngày sau đó khi bạn trở nên quen thuộc hơn với cách hoạt động của WPF. Tạo điều khiển của bạn dưới dạng điều khiển tùy chỉnh sẽ yêu cầu kiến ​​thức về ControlTemplate s và Style vì bạn sẽ cần phải cung cấp quyền kiểm soát của mình để xác định giao diện cho kiểm soát của bạn.

Khi tất cả được nói và thực hiện, miễn là điều khiển hoạt động chính xác, không quan trọng bạn sử dụng phương pháp nào.

Xem this đăng ví dụ về hai cách tiếp cận cho cùng một vấn đề. Tác giả bài đăng muốn có quyền kiểm soát có thể trình bày nội dung phương thức ở phía trước nội dung chính. Tác giả bài đăng thực sự đã trả lời câu hỏi của riêng mình bằng cách triển khai nó dưới dạng UserControl. Tôi đã thêm một câu trả lời cho bài viết tạo điều khiển dưới dạng điều khiển tùy chỉnh nhưng cả hai đều có cùng tác dụng cuối.

1

(Xin lỗi cho đăng là câu trả lời, không thể bình luận. Nếu bạn sẽ tìm thấy nó hữu ích cảm thấy tự do để thêm video này như bình luận cho câu trả lời ví dụ. Benjamin không?)

Bạn có thể dễ dàng thiết kế trực quan CustomControl. Tạo mới UserControl (hoặc Cửa sổ). Tạo cấu trúc xaml của nó một cách trực quan trong Designer. Sao chép-dán nội dung của kết quả xaml bên trong ControlTemplate trong số CustomControl mới của bạn (Ví dụ: trong tệp chủ đề chung).

Nếu tôi nhớ đúng, bạn cũng có thể trực tiếp thiết kế mẫu CustomControl trực tiếp, trong Trộn.

Tất nhiên bạn cũng có thể thể hiện tuỳ chỉnh Wip CustomControl trong cửa sổ và đặt khung nhìn Thiết kế của Cửa sổ làm bảng điều khiển mới phía trên chế độ xem xaml của điều khiển trong VisualStudio. Một số ràng buộc xaml từ mẫu kiểu không hiển thị trong Nhà thiết kế như thế này, cho đến khi tôi xây dựng lại.

[Imho GUI chủ yếu là một vấn đề hình ảnh và không nên, và không cần phải được tạo trong mã. ]

-1

Bạn luôn có thể dựa vào, giới thiệu microsoft-phong cách tự giải thích:

User Control (WPF) - điều khiển người dùng Windows Presentation Foundation
Custom Control (WPF) - Windows Presentation Foundation điều khiển tùy chỉnh

+0

Haha, rất buồn cười :) –

4
  • Nếu bạn có một cái nhìn mô hình và bạn muốn tạo một cái nhìn cho nó sử dụng người dùng kiểm soát.

  • Nếu bạn cần một tự trị điều khiển mà không có người xem mô hình cụ thể,
    bạn có thể cần một tùy chỉnh kiểm soát.

  • Nếu bạn thấy rằng các chức năng bạn cần như toàn bộ, đã tồn tại trong điều khiển khác mà bạn cần phải ghi đè một hiện kiểm soát mẫu.
    (ví dụ: cho một nút kim cương hình - bạn cần phải ghi đè lên các mẫu nút điều khiển.)

  • Về gắn-tài sản và gắn-hành vi, đó là hữu ích khi bạn có một điều khiển mà bạn muốn mở rộng với nhiều thuộc tính hơn hoặc bạn muốn nó hoạt động hơi khác với hành vi mặc định của nó.

Trong trường hợp được cung cấp, thành phần được mô tả, có thể đạt được điều khiển người dùng hoặc điều khiển tùy chỉnh. Tôi muốn điều khiển tùy chỉnh vì không có mô hình xem cụ thể được cung cấp, "đầu vào" chỉ là thuộc tính được liên kết với một bộ sưu tập mục.

Ồ, và tôi xin lỗi vì đã đến trễ.