原文:
wpf中xaml的型別轉換器與標記擴充套件
這篇來講wpf控制項屬性的型別轉換器
型別轉換器在asp.net控制項中已經有使用過了,由於wpf的介面是可以由xaml組成的,所以標籤的便利也需要型別轉換器.兩者的應用是非常之相似的.
如設定margin屬性
用xaml方式
<cs**button
margin
="1,2,3,4">
button
>
button btn = new通過xaml設定margin會將此屬性通過型別轉換器轉成thickness型別.關於型別轉換器相關知識,這裡不多介紹.下面來介紹xaml的標記擴充套件功能.button();
btn.margin = new
thickness(1, 2, 3, 4);
標記擴充套件在wpf的應用中非常之廣泛的.如
資料繫結語法
靜態資源引用
指定資料型別
…標記擴充套件帶來很多好處,一般情況下,xaml的屬性值都是文字字串形式通過型別轉換器形式轉成物件(標籤化語言也存在著侷限性).標記擴充套件可以讓屬性引用某個靜態物件的引用,當然這只是其中的乙個功能,語法則是以左右大括號以區別({}).
這裡我們來比較型別轉換器做不到的問題
換個思路,你想把margin的左上右下的順序變化就不可以了,因為這是型別轉換器,這個順序是定死的.如果用標記擴充套件的話,我們可以假設有下面的語法
雖然感覺起來比直接寫xx,xx,xx,xx這樣麻煩,但增加了靈活性.主要問題是標記擴充套件可以記錄屬性值,型別轉換器只能用文字字串表示.
乙個複雜屬性在xaml的表示方法兩種方法都可以,標記擴充套件提供了乙個多的選擇.看應用而定.當然在沒有型別轉換器的情況下,xaml也允許這樣寫法.相對而言就稍微的複雜一些,一切都是為了簡化.
<button
>
<
button.margin
>
<
thickness
left
="0"
top="0"
right
="0"
bottom
="0">
thickness
>
button.margin
>
button
>
<button
margin
="" />
<比較上面三種方式,肯定最後乙個最簡單,對於記憶不好的也可以嘗試第二種,其實第標記擴充套件也需要你記物件的屬性,萬一大小寫出錯那也麻煩,第一種嘛,**量又太多了,要是都設定乙個屬性都這樣,那**就多了.所以各有各自的好處.button
margin
="0,0,0,0" />
標記擴充套件本身與設計時沒有關係,但型別轉換器卻是設計時必須的功能,二兩者又有著類似之處,所以這裡介紹一下.
下面介紹自定義標記擴充套件的方法
(1)定義乙個派生自system.windows.markup.markupextension的類,該類要求重寫providevalue方法
namespace wpf.controls}}(2)與xml命名空間關聯,在程式集專案中的assemblyinfo新增元資料,xmlnsdefinition元資料可以幫助統一命名空間,因為這樣我們才可以很簡單的使用wpf內建控制項(很多控制項都在不同命名空間下),xmlnsprefix的作用就如asp.net內建控制項以asp開始一樣
[assembly: xmlnsdefinition("", "wpf.controls")]現在我們將providevalue方法變更為[assembly: xmlnsprefix("", "ext")]
public override object providevalue(iserviceprovider serviceprovider)然後在xaml中使用該擴充套件標記
<上面**可以成功執行,我們還需要為擴充套件標記新增屬性,用於傳遞引數.window x:
class
xmlns
=""xmlns:x
=""xmlns
:ext
=""title
="window1"
height
="100"
width
="200">
<
grid
>
<
button
margin
=""
content
="hello" />
grid
>
window
>
(3)新增屬性. 在xaml中新增的物件,都以預設的建構函式進來,同時可以用markupextensionreturntype指定標記擴充套件返回的安全型別
[markupextensionreturntype(typeof(thickness))]現在就可以使用了public class
thicknes***tension : markupextension
public thicknes***tension()
public double bottom
public double left
public double right
public double top
}
<button x:
name
="demo"
margin
=""
content
="hello">
button
>
wpf中xaml的型別轉換器與標記擴充套件
這篇來講wpf控制項屬性的型別轉換器 型別轉換器在asp.net控制項中已經有使用過了,由於wpf的介面是可以由xaml組成的,所以標籤的便利也需要型別轉換器.兩者的應用是非常之相似的.如設定margin屬性 用xaml方式 button margin 1,2,3,4 button cs butto...
wpf中xaml的型別轉換器與標記擴充套件
這篇來講wpf控制項屬性的型別轉換器 型別轉換器在asp.net控制項中已經有使用過了,由於wpf的介面是可以由xaml組成的,所以標籤的便利也需要型別轉換器.兩者的應用是非常之相似的.如設定margin屬性 用xaml方式 button margin 1,2,3,4 button cs butto...
註冊型別轉換器
僅僅為該應用提供型別轉換器還不夠,因為 struts 2 依然不知道何時使用這些型別轉換器,所以我們必須將型別轉換器註冊在 web應用中,struts 2 框架才可以正常使用該型別轉換器。struts 2 支援如下三種註冊型別轉換器的方式。註冊區域性型別轉換器 區域性型別轉換器僅僅對某個 actio...