WPF - Thuộc tính phụ thuộc
Trong các ứng dụng WPF, thuộc tính phụ thuộc là một loại thuộc tính cụ thể mở rộng thuộc tính CLR. Nó tận dụng lợi thế của các chức năng cụ thể có sẵn trong hệ thống thuộc tính WPF.
Một lớp xác định thuộc tính phụ thuộc phải được kế thừa từ DependencyObjectlớp học. Nhiều lớp điều khiển giao diện người dùng được sử dụng trong XAML có nguồn gốc từDependencyObject lớp và chúng hỗ trợ các thuộc tính phụ thuộc, ví dụ: lớp Nút hỗ trợ IsMouseOver tài sản phụ thuộc.
Mã XAML sau tạo một nút với một số thuộc tính.
<Window x:Class = "WPFDependencyProperty.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local = "clr-namespace:WPFDependencyProperty"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<Button Height = "40" Width = "175" Margin = "10" Content = "Dependency Property">
<Button.Style>
<Style TargetType = "{x:Type Button}">
<Style.Triggers>
<Trigger Property = "IsMouseOver" Value = "True">
<Setter Property = "Foreground" Value = "Red" />
</Trigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
</Grid>
</Window>
Phần mở rộng đánh dấu x: Type trong XAML có chức năng tương tự như typeof () trong C #. Nó được sử dụng khi các thuộc tính được chỉ định có kiểu đối tượng chẳng hạn như <Style TargetType = "{x: Type Button}">
Khi đoạn mã trên được biên dịch và thực thi, bạn sẽ nhận được những thứ sau MainWindow. Khi chuột ở trên nút, nó sẽ thay đổi màu nền trước của nút. Khi con chuột rời khỏi nút, nó sẽ thay đổi trở lại màu ban đầu.
Tại sao chúng ta cần thuộc tính phụ thuộc
Thuộc tính phụ thuộc mang lại cho bạn tất cả các loại lợi ích khi bạn sử dụng nó trong ứng dụng của mình. Thuộc tính phụ thuộc có thể được sử dụng trên thuộc tính CLR trong các trường hợp sau:
- Nếu bạn muốn thiết lập phong cách
- Nếu bạn muốn ràng buộc dữ liệu
- Nếu bạn muốn thiết lập bằng tài nguyên (tài nguyên tĩnh hoặc động)
- Nếu bạn muốn hỗ trợ hoạt hình
Về cơ bản, Thuộc tính Phụ thuộc cung cấp rất nhiều chức năng mà bạn sẽ không có được bằng cách sử dụng thuộc tính CLR.
Sự khác biệt chính giữa dependency properties và khác CLR properties được liệt kê dưới đây -
Thuộc tính CLR có thể đọc / ghi trực tiếp từ thành viên riêng của một lớp bằng cách sử dụng getter và setter. Ngược lại, các thuộc tính phụ thuộc không được lưu trữ trong đối tượng cục bộ.
Thuộc tính phụ thuộc được lưu trữ trong từ điển các cặp khóa / giá trị được cung cấp bởi lớp DependencyObject. Nó cũng tiết kiệm rất nhiều bộ nhớ vì nó lưu trữ tài sản khi thay đổi. Nó cũng có thể bị ràng buộc trong XAML.
Thuộc tính phụ thuộc tùy chỉnh
Trong khuôn khổ .NET, các thuộc tính phụ thuộc tùy chỉnh cũng có thể được xác định. Làm theo các bước dưới đây để xác định thuộc tính phụ thuộc tùy chỉnh trong C #.
Khai báo và đăng ký của bạn dependency property với đăng ký cuộc gọi hệ thống.
Cung cấp setter và getter cho tài sản.
Xác định một static handler sẽ xử lý bất kỳ thay đổi nào xảy ra trên toàn cầu
Xác định một instance handler sẽ xử lý bất kỳ thay đổi nào xảy ra với phiên bản cụ thể đó.
Mã C # sau đây xác định một thuộc tính phụ thuộc để đặt SetText tài sản của người dùng kiểm soát.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApplication3 {
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
}
public static readonly DependencyProperty SetTextProperty =
DependencyProperty.Register("SetText", typeof(string), typeof(UserControl1), new
PropertyMetadata("", new PropertyChangedCallback(OnSetTextChanged)));
public string SetText {
get { return (string)GetValue(SetTextProperty); }
set { SetValue(SetTextProperty, value); }
}
private static void OnSetTextChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e) {
UserControl1 UserControl1Control = d as UserControl1;
UserControl1Control.OnSetTextChanged(e);
}
private void OnSetTextChanged(DependencyPropertyChangedEventArgs e) {
tbTest.Text = e.NewValue.ToString();
}
}
}
Đây là tệp XAML trong đó TextBlock được định nghĩa là điều khiển của người dùng và thuộc tính Text sẽ được gán cho nó bởi thuộc tính phụ thuộc SetText.
Mã XAML sau đây tạo điều khiển người dùng và khởi tạo SetText tài sản phụ thuộc.
<Window x:Class = "WpfApplication3.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views = "clr-namespace:WpfApplication3"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<views:UserControl1 SetText = "Hellow World"/>
</Grid>
</Window>
Hãy chạy ứng dụng này. Bạn có thể thấy ngay rằng trong MainWindow của chúng tôi, thuộc tính phụ thuộc để kiểm soát người dùng đã được sử dụng thành công dưới dạng Văn bản.