wpf中xaml的类型转换器与标记扩展
??? 這篇來講wpf控件屬性的類型轉(zhuǎn)換器
類型轉(zhuǎn)換器
?
類型轉(zhuǎn)換器在asp.net控件中已經(jīng)有使用過了,由于wpf的界面是可以由xaml組成的,所以標簽的便利也需要類型轉(zhuǎn)換器.兩者的應(yīng)用是非常之相似的.
如設(shè)置Margin屬性
用xaml方式
cs代碼
Button btn = new Button(); btn.Margin = new Thickness(1, 2, 3, 4);
通過xaml設(shè)置Margin會將此屬性通過類型轉(zhuǎn)換器轉(zhuǎn)成Thickness類型.關(guān)于類型轉(zhuǎn)換器相關(guān)知識,這里不多介紹.下面來介紹xaml的標記擴展功能.
標記擴展
標記擴展在wpf的應(yīng)用中非常之廣泛的.如
數(shù)據(jù)綁定語法 {Binding Path=…}
靜態(tài)資源引用 {StaticResource …}
指定數(shù)據(jù)類型{x:Type prefix:typeNameValue}
…
標記擴展帶來很多好處,一般情況下,xaml的屬性值都是文本字符串形式通過類型轉(zhuǎn)換器形式轉(zhuǎn)成對象(標簽化語言也存在著局限性).標記擴展可以讓屬性引用某個靜態(tài)對象的引用,當然這只是其中的一個功能,語法則是以左右大括號以區(qū)別({}).
左上右下問題
這里我們來比較類型轉(zhuǎn)換器做不到的問題
我想大家在剛學wpf或者silverlight的時候,在設(shè)置Margin屬性的時候,都常常會忘掉四邊的順序,即左上右下,如下blend的屬性編輯器.
換個思路,你想把Margin的左上右下的順序變化就不可以了,因為這是類型轉(zhuǎn)換器,這個順序是定死的.如果用標記擴展的話,我們可以假設(shè)有下面的語法
{Margin Top=76,Left=76,Right=168,Bottom=0}
雖然感覺起來比直接寫xx,xx,xx,xx這樣麻煩,但增加了靈活性.主要問題是標記擴展可以記錄屬性值,類型轉(zhuǎn)換器只能用文本字符串表示.
一個復(fù)雜屬性在xaml的表示方法兩種方法都可以,標記擴展提供了一個多的選擇.看應(yīng)用而定.當然在沒有類型轉(zhuǎn)換器的情況下,xaml也允許這樣寫法.相對而言就稍微的復(fù)雜一些,一切都是為了簡化.
?
<Button Margin="{Margin Top=0,Left=0,Right=0,Bottom=0}" /><Button Margin="0,0,0,0" />
比較上面三種方式,肯定最后一個最簡單,對于記憶不好的也可以嘗試第二種,其實第標記擴展也需要你記對象的屬性,萬一大小寫出錯那也麻煩,第一種嘛,代碼量又太多了,要是都設(shè)置一個屬性都這樣,那代碼就多了.所以各有各自的好處.
自定義標記擴展
標記擴展本身與設(shè)計時沒有關(guān)系,但類型轉(zhuǎn)換器卻是設(shè)計時必須的功能,二兩者又有著類似之處,所以這里介紹一下.
下面介紹自定義標記擴展的方法
(1)定義一個派生自System.Windows.Markup.MarkupExtension的類,該類要求重寫ProvideValue方法
(2)與xml命名空間關(guān)聯(lián),在程序集項目中的AssemblyInfo添加元數(shù)據(jù),XmlnsDefinition元數(shù)據(jù)可以幫助統(tǒng)一命名空間,因為這樣我們才可以很簡單的使用wpf內(nèi)置控件(很多控件都在不同命名空間下),XmlnsPrefix的作用就如asp.net內(nèi)置控件以asp開始一樣<asp:Label />
public override object ProvideValue(IServiceProvider serviceProvider) {return new Thickness(); }
然后在xaml中使用該擴展標記
<Window x:Class="WpfApplication1.Window1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:ext="http://wpf.controls"Title="Window1" Height="100" Width="200"><Grid><Button Margin="{ext:Thickness}" Content="Hello" /></Grid> </Window>
上面代碼可以成功運行,我們還需要為擴展標記添加屬性,用于傳遞參數(shù).
(3)添加屬性. 在xaml中添加的對象,都以默認的構(gòu)造函數(shù)進來,同時可以用MarkupExtensionReturnType指定標記擴展返回的安全類型
現(xiàn)在就可以使用了
<Button x:Name="demo" Margin="{ext:Thickness Left=10,Bottom=10,Right=10,Top=30}"Content="Hello"></Button> posted on 2018-12-17 10:19 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/lonelyxmas/p/10129900.html
總結(jié)
以上是生活随笔為你收集整理的wpf中xaml的类型转换器与标记扩展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#的委托事件总结
- 下一篇: python字符串面试题:找出一个字符串