24h購物| | PChome| 登入
2011-08-12 23:48:48| 人氣187| 回應0 | 上一篇 | 下一篇
推薦 0 收藏 0 轉貼0 訂閱站台

Silverlight:Dependency Property(依赖属性)学习笔记

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来说无信是一种极大的机能损耗。 ­

台長: wangdandan19
人氣(187) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 音樂賞析(音樂情報、樂評、歌詞、MV)

TOP
詳全文