很早之前就看到DependencyProperty,但是每次看到都不想去深入,一眼看過去好難的樣子,今天靜下來學(xué)習(xí)一下,怕自己過幾天又忘了,來記錄一下自己學(xué)習(xí)的東西。
首先我們來看看這個(gè)東西,
public static readonly DependencyProperty ItemContainerStyleProperty = DependencyProperty.Register( " ItemContainerStyle " , typeof (string), typeof (MyControl), new PropertyMetadata( null , OnItemContainerStylePropertyChanged));
第一眼被嚇懵了,都干嘛的,好厲害的樣子,下面慢慢來說:上面就是定義了一個(gè)依賴屬性,干嘛用的,看名字就是用來設(shè)置屬性的,來看看參數(shù)ItemContainerStyle這個(gè)相當(dāng)于標(biāo)示符,在你寫xaml設(shè)置的時(shí)候,系統(tǒng)會(huì)去找到你設(shè)置的這個(gè)名字進(jìn)行操作,typeof(string)設(shè)置類型,typeof(MyControl)這個(gè)告訴系統(tǒng)你這個(gè)注冊(cè)的屬性是屬于哪個(gè)類的,new PropertyMetadata(null, OnItemContainerStylePropertyChanged)屬性值改變時(shí)觸發(fā)的事件和屬性的初始值
public string ContentInfo { get { return ( string )GetValue(ItemContainerStyleProperty); } set { SetValue(ItemContainerStyleProperty, value); } }
上面這個(gè)應(yīng)該沒問題了,就是設(shè)置或者獲取屬性了,ContentInfo就是你調(diào)用自己寫的控件時(shí)可以看到的屬性了
[TemplatePart(Name = InnerSelectorName, Type = typeof (LongListSelector))] [StyleTypedProperty(Property = "MyWidth " , StyleTargetType = typeof (MyControl))] [TemplateVisualState(Name =”Selected“, GroupName = "SelectionStates")]
剛看到上面這幾個(gè)大括號(hào)我又懵了,慢慢來吧:
TemplatePart的作用是*.cs中對(duì)于*.xaml中定義的控件進(jìn)行獲取,并進(jìn)行操作,不好理解,其實(shí)就是在資源字典ResourceDictionary中(也就是一個(gè).xaml)定義中可以使用.cs的屬性一些東西,.cs可以使用到.xaml里面的動(dòng)畫一些東西
StyleTypedProperty:?FontSize="{TemplateBinding FontSize}“這個(gè)大家應(yīng)該在自定義控件時(shí)在.xmal經(jīng)常看到吧,改一下FontSize="{TemplateBinding?MyWidth}“,沒錯(cuò)StyleTypedProperty就是關(guān)聯(lián)cs里面的MyWidth屬性
TemplateVisualState:這個(gè)就是我們經(jīng)常看到的過度狀態(tài)了,看看這個(gè)代碼,是不是明白了
<VisualStateGroup x:Name= " SelectionStates " > <VisualState x:Name= " Selected " /> </VisualStateGroup>
說到底上面的這幾個(gè)都是*.cs中對(duì)于*.xaml中定義的控件進(jìn)行獲取,并進(jìn)行操作,xaml里面可以用cs里面設(shè)置的屬性,cs里面可以調(diào)用.xmal里面寫的個(gè)種動(dòng)畫效果
?
然后來說說EventHandler事件,來代碼
public event EventHandler ManipulationStateChanged; public event PropertyChangedEventHandler PropertyChanged; public override void OnApplyTemplate() { base .OnApplyTemplate(); _myControl.Clear(); if (_myControl!= null ) { _myControl.ManipulationStateChanged -= OnInnerSelectorManipulationStateChanged; _innerSelector.PropertyChanged -= OnInnerSelectorPropertyChanged; } _myControl = this .GetTemplateChild(InnerSelectorName) as LongListSelector; if (_myControl!= null ) { _myControl.ManipulationStateChanged += OnInnerSelectorManipulationStateChanged; _myControl.PropertyChanged += OnInnerSelectorPropertyChanged; } }
這個(gè)比較簡單了,就是事件的訂閱和取消了
?
上面這些都是繼承Control寫的,如果要實(shí)現(xiàn)listbox這種需要item這種單項(xiàng)內(nèi)容的,還要加入繼承ContentControl的item相應(yīng)的屬性的方法,要是覺的直接繼承Control很多屬性和事件都被加進(jìn)來太多的話還可以自己寫個(gè)DependencyProperty 和DependencyObject,詳細(xì)可以參考一下這篇DependencyObject,更深入的以后學(xué)習(xí)了在發(fā)
?
?
?
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
