2011-11-20 40 views
8

tôi đã xây dựng được một User Control gồm, như thường lệ, một phần XAML và một phần code-behind. Bây giờ, tôi cần phải tạo một điều khiển người dùng khác mà chia sẻ một số chức năng của trước đây, nhưng có vẻ ngoài khác nhau và cũng có thể có các tính năng bổ sung trong mã-đằng sau.Mở rộng điều khiển người dùng trong WPF

Ý tưởng đầu tiên của tôi là tạo giao diện để thu thập các chức năng phổ biến của hai loại điều khiển. Đây có phải là cách đi đúng không? Và tôi sẽ quản lý các phần XAML khác nhau như thế nào? Mọi lời khuyên đều được chào đón.

+0

Có vẻ như codebehind là vấn đề chứ không phải kiểm soát. –

+0

Ritch, ý của bạn là gì? – Tilvia

+1

Có vẻ như bạn muốn thay đổi hình ảnh nhưng sử dụng cùng một hành vi hoặc thêm vào đó. Thực tế là tất cả mã hành vi đó bị mắc kẹt trong mã-đằng sau và không khả dụng để sử dụng lại đang gây ra sự cố.Bạn có quen thuộc với các mẫu trình bày, chẳng hạn như MVVM không? –

Trả lời

9

Tôi muốn thêm một sự đóng góp mà tôi nghĩ có thể có ích cho những người khác gặp phải tình cảnh tương tự của tôi. Một giải pháp khả thi khác, theo ý kiến ​​của tôi là phù hợp nếu các điều khiển bạn tạo ra không đặc biệt phức tạp, là tạo một Điều khiển người dùng cơ sở chứa các tính năng phổ biến mà bạn muốn chia sẻ: điều khiển như vậy sẽ được viết hoàn toàn trong C#. Điều này, trên thực tế, cho phép thừa kế trong điều khiển người dùng bao gồm cả XAML và mã phía sau. Trong XAML của sự kiểm soát di truyền, thay vì phải

<UserControl> ... </UserControl> 

Bạn sẽ phải

<MyProject: MyBaseControl x:Class="MyProject.MyExtendedControl"> ... </MyProject: MyBaseControl> 

và sau đó trong mã phía sau bạn cũng sẽ cần phải xác định như sau:

class MyExtendedControl : MyBaseControl 

Hi vọng điêu nay co ich.

2

Điều khiển người dùng không cho vay tốt để thừa kế trong WPF, bạn có thể thực hiện một số lỗi để làm việc, nhưng nhìn chung bạn có thể nên sử dụng Custom Control thay thế. Nó dễ dàng hơn để xác định XAML khác nhau cho các điều khiển kế thừa sử dụng kỹ thuật này. Cách dễ nhất để bắt đầu với một điều khiển tùy chỉnh là thêm một mục mới vào dự án của bạn kiểu "Custom Control (WPF)" và nó sẽ thêm điều khiển và XAML được thêm vào Themes/generic.xaml cho bạn.

Để kế thừa từ kiểm soát này, cách đơn giản nhất là thêm một mới Custom Control (WPF) và sau đó thay đổi mã đằng sau kế thừa từ phụ huynh kiểm soát của bạn thay vì kiểm soát.

+0

Vì vậy, nếu tôi hiểu đúng, đề xuất của bạn là tôi nên có hai điều khiển tùy chỉnh kế thừa từ một điều khiển thứ ba chứa các tính năng phổ biến? – Tilvia

+1

Đúng vậy, một tùy chọn khác nếu bạn chỉ có một vài tính năng phổ biến là tiếp tục sử dụng UserControls và sử dụng các thuộc tính hoặc hành vi được đính kèm cho các tính năng phổ biến –

2

Có một số cách để chia tay các mảnh để làm cho họ dễ dàng hơn để làm việc với.

MVVM, như đã đề cập trong một chú thích, dựa vào dữ liệu Ràng buộc để tách các điều khiển đầu vào từ logic. Bằng cách thiết lập lớp thích hợp mà thực hiện INotifyPropertyChanged vào DataContext của bạn kiểm soát, bạn có thể thay đổi hành vi. Lớp DataContext hoặc ViewModel của bạn có thể triển khai thuộc tính Visibility để hiển thị và ẩn các phần khác nhau của đầu vào nếu sự khác biệt không quá lớn giữa các lần sử dụng.

Một cách khác để phá vỡ chức năng là bởi tập hợp. Xem StackOverflow 269496

Bạn có thể tạo các điều khiển nhỏ hơn thực hiện chức năng chung và sau đó tạo các điều khiển mục đích đặc biệt lớn hơn bằng cách kết hợp các điều khiển nhỏ hơn (tức là tổng hợp chúng) để kiểm soát lớn hơn. Tập hợp sẽ làm việc cho cả phương pháp mã-đằng sau và cách tiếp cận Ràng buộc dữ liệu.

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