wpf中xaml的型別轉換器與標記擴充套件

2021-09-07 20:45:09 字數 3098 閱讀 8858

原文:

wpf中xaml的型別轉換器與標記擴充套件

這篇來講wpf控制項屬性的型別轉換器

型別轉換器在asp.net控制項中已經有使用過了,由於wpf的介面是可以由xaml組成的,所以標籤的便利也需要型別轉換器.兩者的應用是非常之相似的.

如設定margin屬性

用xaml方式

<

button

margin

="1,2,3,4">

button

>

cs**

button btn = new 

button();

btn.margin = new

thickness(1, 2, 3, 4);

通過xaml設定margin會將此屬性通過型別轉換器轉成thickness型別.關於型別轉換器相關知識,這裡不多介紹.下面來介紹xaml的標記擴充套件功能.

標記擴充套件在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")]

[assembly: xmlnsprefix("", "ext")]

現在我們將providevalue方法變更為

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...