XAML - 依赖属性
依赖属性是一种特定类型的属性,其值后面跟着一个敏锐的属性系统,该系统也是 Windows 运行时应用的一部分。定义依赖属性的类必须从 DependencyObject 类继承。
XAML 中使用的许多 UI 控件类都派生自 DependencyObject 类并支持依赖属性。以下 XAML 代码创建了一个具有一些属性的按钮。
<Window x:Class = "XAMLDependencyProperty.MainWindow" xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local = "clr-namespace:XAMLDependencyProperty" 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>
XAML 中的 x:Type 标记扩展具有与 C# 中的 typeof() 类似的功能。当指定采用对象类型的属性时(例如 <Style TargetType = "{x:Type Button}">),可以使用该扩展。
编译并执行上述代码时,将生成以下 MainWindow。当鼠标悬停在按钮上时,按钮的前景色会发生变化。当鼠标离开按钮时,按钮会变回其原始颜色。
依赖属性与其他 CLR 属性的主要区别在于 −
CLR 属性可以使用 getter 和 setter 直接从类的私有成员读取/写入。对于依赖属性,它不存储在本地对象中。
依赖属性存储在 DependencyObject 类提供的键/值对字典中。
它还节省了大量内存,因为它会在更改时存储属性。
它也可以绑定在 XAML 中。
在 .NET 框架中,还可以定义自定义依赖属性。以下是在 C# 中定义自定义依赖属性的步骤。
使用系统调用注册器声明并注册您的依赖属性。
为属性提供 setter 和 getter。
定义一个静态处理程序来处理全局发生的任何更改。
定义一个实例处理程序来处理发生在该特定实例上的任何更改。
下面给出了 C# 中依赖属性的代码,该代码定义为设置用户控件的 SetText 属性。
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(); } } }
以下是 XAML 文件,其中 TextBlock 被定义为用户控件,并且 Text 属性将由 SetText 依赖项属性分配给它。
以下 XAML 代码创建一个用户控件,并初始化其 SetText 依赖项属性和一些其他属性。
<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>
让我们运行此应用程序,您可以立即在 MainWindow 中看到用户控件的依赖属性已成功用作文本。