WPF - Tìm Hiểu Về Attached Behaviors Trong WPF

Trong bài viết trước tôi có giới thiệu về Extension Methods trong nguôn ngữ lập trình C#; hôm nay tôi sẽ nói về một vấn đề có ý nghĩa tương tự nhưng lại chuyên biệt cho ứng dụng WPF. Ngoài ra các bạn cũng có thể thấy rằng trong WPF chúng ta có thể Attach khá nhiều thứ ví dụ như Property, đó là điểm mạnh của WPF mà Winform muốn làm được cũng khó.

I> Attached Behaviors là gì?

Tôi sẽ không định nghĩa suông về Attached Behaviors mà tôi sẽ nêu ra tình huống mà chúng ta sẽ phải dùng đến Attached Behaviors, nhưng nôm na chúng ta có thể hiểu Attached Behaviors là việc bạn thêm một hành vi vào một đối tượng Control nào đó mà bản thân nó trước đó không có - bạn sẽ nghĩ đến việc viết một control mới và thêm Behaviors nhưng thật sự không cần thiết khi mà chúng ta có thể đơn giản vấn đề hơn, ngoài ra với mô hình MVVM thì việc viết một control mới và thêm Behaviors thì có khá nhiều vấn đề nảy sinh(các sự kiện về chuột, key..). Tình huống khác đó là Behaviors này cần cho một số các Control khác nhau, vậy Attached tốt hơn hay viết lại hết tất cả các control tốt hơn chưa kể việc bạn sẽ phải thay thế lại hết tất cả các control nếu đã xây dựng trước đó.

Attached behavirs wpf tuanpham wpf
Attached Behaviors không can thiệp quá sâu vào hành vi ứng xử của Control, không làm mất đi tính hướng đối tượng
 Chú ý: khi bạn gặp khó khăn trong việc xử lý sự kiện chuột, phím... đối với mô hình MVVM bạn nên cân nhắc việc dùng Attached Behaviors; Trong bộ công cụ Expression Blend bạn cũng có sẵn khá nhiều Attached Behaviors để dùng

II> Cách dùng  Attached Behaviors

Trước tiên để có thể sử dụng được chúng ta cần tải về bộ thư viện hỗ trợ  Attached Behaviors sau về và Reference:

  1. Microsoft.Expression.Interactivity tại đây (Khuyên dùng).
  2. Blend.Interactivity tại đây hoặc đây
Sau đó tôi sẽ tạo một lớp DragMoveBehaviorImplament của Behavior<UIElement> . Mục đích lớp này là thêm tính năng DragMove cho các đối tượng là UIElement - nghĩa là khi tôi giữ chuột TRÁI và kéo thì Form/Window chứa UIElement đó sẽ di chuyển theo(UIElement là một thẻ bất kỳ có chức năng UI).
MainWindow.cs


#region

using System.Windows;
using System.Windows.Interactivity;

#endregion

namespace Attach_Behaviors
{
internal class DragMoveBehavior : Behavior
{
protected override void OnAttached()
{
base.OnAttached();

// Lấy ra Windows đang chứa đối tượng bị tác người dùng động
// Đối tượng bị tác người dùng động chính là AssociatedObject
Window parentwindow = Window.GetWindow(AssociatedObject);

AssociatedObject.MouseLeftButtonDown +=
(sender, e) =>
{
if (parentwindow != null)
// Tiến hành DragMove
parentwindow.DragMove();
};
}
}
}


Chú ý:
  • AssociatedObject chính là đối tượng UIElement phát sinh Event
  • Không phải tất cả các UIElement đều cho cùng một kết quả DragMove khi MouseLeftButtonDown vì cần xử lý nhiều hơn những dòng code trên với các control đặc thù
Đến đây chúng ta đã có phần Behavior với chức năng DragMove cho tất cả các UIElement. Phần còn lại là Associating phần Behavior với phần UI ta muốn. Đơn giản thôi:
  1. Reference namespace "http://schemas.microsoft.com/expression/2010/interactivity"
  2. Reference namespace "clr-namespace:Attach_Behaviors" - chính là namespace của Project hiện tại
  3. Chọn đúng đối tượng cần behavior này và type mà behavior hỗ trợ cần trùng với type của đối tượng thừa hưởng behavior(ở đây là UIElement: Button, Grid, TextBox, GroupBox...)
MainWindow.XAML























Kết quả

 Attached behavior tuanpham wpf

Bạn có thể tải về SourceCode tại đây. Chúc các bạn thành công!
Phạm Tuân


Chúc các bạn thành công!
PHẠM TUÂN