2015-11-30 41 views
11

Tại sao chúng ta thực sự cần kiểm soát người dùng?Mục đích của UserControl là gì?

Window:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:wpfApplication1="clr-namespace:WpfApplication1"> 

    <wpfApplication1:SaveCloseUserControl /> 

</Window> 

kiểm soát tài khoản:

<UserControl x:Class="WpfApplication1.SaveCloseUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<StackPanel Orientation="Horizontal"> 
    <Button Height="30" Content="Save" /> 
    <Button Height="30" 
      Margin="1" 
      Content="Cancel" /> 
</StackPanel> 
</UserControl> 

Mã đằng sau:

public partial class SaveCloseUserControl : UserControl 
{ 
    public SaveCloseUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

Tôi không thấy bất kỳ lý do tại sao tôi nên quấn một StackPanel (hoặc bất kỳ khác kiểm soát) bên trong của một UserControl, nếu mã sau mà không có UserControl sẽ làm chính xác như nhau.

Window: bảng

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:wpfApplication1="clr-namespace:WpfApplication1"> 

    <wpfApplication1:SaveCloseStackPanel /> 

</Window> 

stack mà không cần người dùng kiểm soát:

<StackPanel x:Class="WpfApplication1.SaveCloseUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      Orientation="Horizontal"> 
    <Button Height="30" Content="Save" /> 
    <Button Height="30" 
      Margin="1" 
      Content="Cancel" /> 
</StackPanel> 

Mã đằng sau:

public partial class SaveCloseUserControl : StackPanel 
{ 
    public SaveCloseUserControl() 
    { 
     InitializeComponent(); 
    } 
} 

Tôi đã sử dụng usercontrol ở khắp mọi nơi, nhưng bây giờ khi tôi suy nghĩ về nó, họ không làm gì ngoài việc gói một món đồ trong đó. Vì vậy, tôi đã thử nó trên 10 quan điểm khác nhau, và không quan trọng nó là gì, tôi đã có thể thay thế UserControl với các mặt hàng khác (Grid, ComboBox, GroupBox vv), và tất cả các công trình chính xác theo cùng một cách. Vì vậy, để được rõ ràng, nếu tôi đã có một điều khiển người dùng và điều đầu tiên trong nó là ComboBox, sau đó tôi loại bỏ UserControl và đặt ComboBox ở vị trí của nó. Tất cả mọi thứ bên trong sau đó vẫn như cũ, giống như ví dụ trên với StackPanel.

Tại sao tôi thậm chí còn bận tâm với UserControl và có một mục khác được tạo và hiển thị nếu nó không làm gì?

+0

Bạn sẽ sử dụng lại thành phần đó ở nhiều nơi như thế nào trong khi cung cấp các bộ phận riêng của mình như quy tắc xác thực dữ liệu và chức năng thuyết bất khả tri của chế độ xem khác? Ah haaa ....: D –

+0

@ChrisW. Chính xác theo cách tương tự như với usercontrol, bởi vì tất cả những gì tôi đã làm là, tôi đã thay thế thẻ UserControl bằng StackPanel trong trường hợp này (thẻ bắt đầu và đóng của một tệp xaml). Xác nhận, ràng buộc v.v., mọi thứ hoạt động như nó. – adminSoftDK

+0

Ah ok Tôi không nhận thấy bạn đã tạo lớp học của riêng bạn. Sau đó, tôi thấy quan điểm của bạn. Tôi đoán lập luận sẽ dựa nhiều hơn vào các vấn đề bảo trì mã sau đó vì tôi biết nếu tôi phải bước vào một dự án lớn và tìm thấy những thứ kết hợp với nhau theo cách không chuẩn, tôi sẽ khóc một chút ở bên trong lol. Ngoại trừ khi một người nào đó có thể cung cấp một câu trả lời được xác định về mặt kỹ thuật, tôi có thể thấy điều này trở thành một cuộc thảo luận tán gẫu về loại câu hỏi ý kiến. –

Trả lời

12

Mục đích của một UserControl là để nhóm một nhóm điều khiển thành một thành phần có thể tái sử dụng. Họ không thể được tạo kiểu hoặc được tô điểm.

Mục đích của Custom Controlmở rộng kiểm soát hiện có hoặc để tạo kiểm soát hoàn toàn mới. Những điều này, trái ngược với một số UserControlcó thể được tạo kiểu và được tô điểm.

Tôi nghĩ bạn đang bị lẫn lộn với cả hai.

Vì vậy, bạn có thể thắc mắc, "Khi nào tôi nên sử dụng số UserControl và khi nào tôi nên sử dụng Custom Control?" và câu trả lời cho điều đó là nó phụ thuộc.

Bạn nên sử dụng UserControl khi bạn cần tạo nhóm kiểm soát hợp lý tương tác theo cách nào đó để tạo điều khiển tổng hợp tổng hợp. Bạn nên sử dụng một Custom Control khi bạn muốn thêm chức năng vào điều khiển hiện tại.

Trong ví dụ của bạn, cách tiếp cận tốt nhất của bạn là sử dụng UserControl, vì StackPanelnhóm các điều khiển được tạo thành một thành phần có thể tái sử dụng.

Bạn có thể tìm hiểu thêm một chút herehere.

+0

Cảm ơn bạn đã trả lời. Tôi hiểu sự khác biệt, tôi chỉ đơn giản là không thấy sự cần thiết phải sử dụng một UserControl ở tất cả. Nếu mục đầu tiên trong UserControl cũng có thể thay thế cho điều khiển người dùng. Và sau đó nó hoạt động chính xác theo cùng một cách, tôi có thể tái sử dụng nó vv, nhưng bù lại tôi nhận được một điều khiển ít hơn, đó phải là một điều tốt. – adminSoftDK

+1

Ngoài nhận xét của Mike, hãy chỉ kiểm soát người dùng khi bạn biết rằng bạn sẽ cần nhiều lần điều khiển như vậy. Một trường hợp người dùng khác cho User Controls đơn giản là các khung nhìn trong sự phát triển MVVM. Tất cả các quan điểm của bạn là gì, nhưng một tập hợp các điều khiển và có thể được tái sử dụng. – Neeraj

+0

@adminSoftDK, phần mở rộng logic của đối số của bạn sẽ ngụ ý rằng chúng ta không cần cấu trúc hoặc lớp (kiểu dữ liệu trừu tượng), bởi vì chúng chỉ đơn thuần là tập hợp nhiều kiểu cơ bản hơn và các hành vi liên quan. Tập hợp các 'thứ' đơn giản hơn - cho dù chúng là các điều khiển hay các kiểu dữ liệu đơn giản hơn, và bất kỳ 'logic' liên quan nào liên kết chúng lại với nhau, là một cơ sở OOP rất có giá trị. Điều khiển người dùng cung cấp chính xác điều này. Tất nhiên, nếu nhu cầu của bạn khá đơn giản, điều khiển người dùng có thể là quá mức cần thiết (giống như một cấu trúc hoặc một lớp có thể là một quá mức cần thiết), nhưng nó khá hữu ích vào những lúc khác. – Vatsan

2

Mục đích của UserControl là giúp bạn tạo thành phần UI có thể sử dụng lại có thể được thêm vào hộp công cụ của bạn giống như điều khiển tích hợp, bắt đầu từ không có gì. Tiền tố "Người dùng" ở đây có nghĩa là "Không phải từ nhóm WPF". WPF không gửi bất kỳ lớp nào có nguồn gốc từ UserControl. Một khía cạnh rất quan trọng của UserControls là bạn có thể thiết kế chúng bằng cách sử dụng XAML (để chúng có thể được tổng hợp), và mã gói + XAML với nhau, có thể trong một "thư viện" lắp ráp mà bạn có thể gửi mà không có nguồn.

Bây giờ, các ví dụ của bạn khá thiếu máu (không vi phạm :-), họ không làm bất cứ điều gì thú vị đến nỗi tôi sẽ bị cám dỗ để làm cho chúng thực sự có thể tái sử dụng được. Hầu hết thời gian, bạn sẽ xây dựng UserControls từ việc sử dụng (hoặc trải nghiệm), sau khi nhận ra rằng bạn đã lặp lại cùng một mẫu XAML nhiều lần, có thể với một vài biến thể. Ví dụ trong dự án mã nguồn mở này (Github cho Visual Studio): https://github.com/github/VisualStudio/tree/master/src/GitHub.UI/Controls, bạn sẽ thấy họ đã viết một số điều khiển tùy chỉnh, như EmojiImage (bắt nguồn từ Hình ảnh và không cần XAML) và một UserControl : HorizontalShadowDivider. Tại sao? Bởi vì HorizontalShadowDivider có XAML liên kết với nó và là (có thể) được sử dụng ở nhiều nơi.

2

Tôi đã đọc ở đâu đó từ một cuốn sách (xin lỗi quên tiêu đề sách ...) mà UserControl là một hộp "chặn hộp".

Theo hiểu biết của tôi về thuật ngữ và sử dụng ví dụ làm cơ sở, bạn có thể thấy rằng StackPanel dẫn xuất bị hạn chế khả năng StackPanel bố trí hai nút - ngang hoặc dọc. Trong tương lai, nếu bố cục này thay đổi (có thể là một yêu cầu mới?), Bạn sẽ cần tạo một lớp dẫn xuất bảng điều khiển mới (Hoặc viết lại lớp hiện có) và sử dụng nó, nói một DockPanel. Thật tệ.

Khi ở trên UserControl nguồn gốc, tất cả những gì bạn phải làm là thay đổi StackPanel thành loại bảng điều khiển khác phù hợp với yêu cầu mới.

Điều đó làm cho hộp thoại UserControl, IMHO.

1

Theo ví dụ của bạn, Nếu bạn đang sử dụng điều khiển người dùng chỉ một lần thì nó không hữu ích. Nhưng trong các trường hợp như vậy, nếu một số phần thiết kế được sử dụng quá nhiều lần và mỗi lần bạn viết mã xaml hoặc bất kỳ logic nào khác để tạo cùng một giao diện người dùng, thì điều khiển người dùng sẽ xuất hiện.

Các vấn đề liên quan