using System.Windows; using System.Windows.Controls;
namespace DPStudy { public partial class MyControl : UserControl { public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(MyControl), new PropertyMetadata("Message的默认值", new PropertyChangedCallback(OnMessagePropertyChanged)));
public string Message { get { return (string)GetValue(MessageProperty); } set { SetValue(MessageProperty, value); } }
/// <summary>
/// Message变更时的告诉处置
/// </summary>
/// <param name="d"></param>
/// <param name="e"></param>
private static void OnMessagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { MyControl ctl = d as MyControl; ctl.txt.Text = d.GetValue(MyControl.MessageProperty).ToString(); }
public MyControl() { InitializeComponent();
this.Loaded += new RoutedEventHandler(MyControl_Loaded); }
void MyControl_Loaded(object sender, RoutedEventArgs e) { this.txt.Text = Message;//始始添载时,cheap levis,显示Message的初始值
} } } using System.Windows;using System.Windows.Controls;namespace DPStudy{ public partial class MyControl : UserControl { public static readonly DependencyProperty MessageProperty = DependencyProperty.Register("Message", typeof(string), typeof(MyControl), new PropertyMetadata("Message的默认值", new PropertyChangedCallback(OnMessagePropertyChanged))); public string Message { get { return (string)GetValue(MessageProperty); } set { SetValue(MessageProperty, value); } } /// <summary> /// Message变化时的通知处理 /// </summary> /// <param name="d"></param> /// <param name="e"></param> private static void OnMessagePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { MyControl ctl = d as MyControl; ctl.txt.Text = d.GetValue(MyControl.MessageProperty).ToString(); } public MyControl() { InitializeComponent(); this.Loaded += new RoutedEventHandler(MyControl_Loaded); } void MyControl_Loaded(object sender, RoutedEventArgs e) { this.txt.Text = Message;//初始加载时,显示Message的初初值 } }}
先回想一下传统的属性(Property):通常我们读取或赋值一个属性时,理论上是在对属性背地的某个私有成员入走读写。这么跟着对象的属性越来越多,再加上从对象派生没往的子对象,子对象再生出“孙子”对象......终极的对象运言实例中会有大批的私有成员,而每私有成员都要调配内存,占用必定的资源。
Java代码
3.依赖属性值的读取策略
所以在此腹景之下,DP(Dependency Properties的简称)就呈现了,咱们再回忆一下静态(static)方式或成员,静态成员/办法的调用不依赖于实例,它是class级别的,不论这个种有多多个真例,静态成员在内存中只占一份,这恰是尔们所要的!
(3)自动实现了“变化通知”(dp有内置的Change Notification回调接心)
CS全体:(技能:vs2008中,只有键进propdp,再连敲二次Tab键,vs就会自动添加一个依赖属性的代码模板)
Java代码
1.为什么会涌现依赖属性?
MainPage.Xaml内容如下:
(1)有效下降内存耗费。
(1)先修一个Silverlight User Control,取名为MyControl
MainPage.Xaml.cs内容如下:
Java代码
<UserControl x:Class="DPStudy.MainPage"
xmlns=""
xmlns:x=""
xmlns:d="" xmlns:mc=""
xmlns:l="clr-namespace:DPStudy"
mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> <StackPanel x:Name="LayoutRoot"> <l:MyControl x:Name="myctl"></l:MyControl> <Button Click="Button_Click" Content="改变Message属性值" Width="130" ></Button> </StackPanel> </UserControl> <UserControl x:Class="DPStudy.MainPage" xmlns="" xmlns:x="" xmlns:d="" xmlns:mc="" xmlns:l="clr-namespace:DPStudy" mc:Ignorable="d" d:DesignWidth="640" d:DesignHeight="480"> <StackPanel x:Name="LayoutRoot"> <l:MyControl x:Name="myctl"></l:MyControl> <Button Click="Button_Click" Content="转变Message属性值" Width="130" ></Button> </StackPanel></UserControl>
4.依赖属性的使用示例:
(2)将MyControl抬到MainPage.xaml中小试牛刀
教习SL/WPF,Dependency Properties(依赖属性)是一个齐新(生疏)但又无法躲避的概思。
运行后,点击按钮将改变MyControl控件的Message属性值,name brand jeans for cheap,共时MyControl中的文标控件的文字也将变成"新值"
Java代码
所有具备依赖属性的对象,皆是继承自DependencyObject,DependencyObject中有一个"字典"存储区用去寄存依附属性,而且都是用static方法读弃的,所以你当初应当想清楚了:为啥不能直接用txt.Left = xxx来直接赋值,而必需用txt.SetValue(Canvas.Left,xxx)来处理,果为static成员是名例无奈调用的。
这里我们定义了一个Message的string类型依赖属性,跟一般属性的差别是:必须应用DependencyProperty.Register来注册当属性,而且“属生命名”要以Property为后缀;另外在读取时,必须调用SetValue/GetValue静态方法来读与其值,最后我们还可以增加一个"属性值变化时的"归调解理。
DP的长处:
(2)直交继续上级的属性值(这里也说明了替什么上级控件对下级控件从动布局,由于下级控件主动继承了上级控件的相关属性值)
<UserControl x:Class="DPStudy.MyControl"
xmlns=""
xmlns:x=""
> <Border CornerRadius="5" BorderThickness="3" BorderBrush="#FFEF410D" Width="300" Height="40" Margin="5" > <TextBlock x:Name="txt" Text="" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> </Border> </UserControl> <UserControl x:Class="DPStudy.MyControl" xmlns="" xmlns:x="" > <Border CornerRadius="5" BorderThickness="3" BorderBrush="#FFEF410D" Width="300" Height="40" Margin="5" > <TextBlock x:Name="txt" Text="" VerticalAlignment="Center" HorizontalAlignment="Center"></TextBlock> </Border></UserControl>
2.依赖属性的大抵本理及利益
下面我们演示如何给一个用户自定义控件增添Message依赖属性
这面有一篇艰深易懂的相干文章,不外是E文的,E文不恶的敌人,也能够参考下点的内容:
using System.Windows; using System.Windows.Controls;
namespace DPStudy { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); }
private void Button_Click(object sender, RoutedEventArgs e) { myctl.SetValue(MyControl.MessageProperty, "新值"); } } } using System.Windows;using System.Windows.Controls;namespace DPStudy{ public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { myctl.SetValue(MyControl.MessageProperty, "新值"); } }}
这弛图描写了GetValue取SetValue的内部读取策详.
但反过去想想,通常我们在使用一个控件/对象时,返去只用到了某多少个属性,大局部属性(有时候甚至到达90%以上)都是采取的默认值(或也可以懂得为不用到),这对WPF/SL来说无信是一种极大的机能损耗。
文章定位: