日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

wpf中xaml的类型转换器与标记扩展

發(fā)布時間:2025/7/14 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wpf中xaml的类型转换器与标记扩展 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
wpf中xaml的類型轉換器與標記擴展 原文:wpf中xaml的類型轉換器與標記擴展

??? 這篇來講wpf控件屬性的類型轉換器

類型轉換器

?

類型轉換器在asp.net控件中已經(jīng)有使用過了,由于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的應用中非常之廣泛的.如
數(shù)據(jù)綁定語法 {Binding Path=…}
靜態(tài)資源引用 {StaticResource …}
指定數(shù)據(jù)類型{x:Type prefix:typeNameValue}

標記擴展帶來很多好處,一般情況下,xaml的屬性值都是文本字符串形式通過類型轉換器形式轉成對象(標簽化語言也存在著局限性).標記擴展可以讓屬性引用某個靜態(tài)對象的引用,當然這只是其中的一個功能,語法則是以左右大括號以區(qū)別({}).

左上右下問題


這里我們來比較類型轉換器做不到的問題

我想大家在剛學wpf或者silverlight的時候,在設置Margin屬性的時候,都常常會忘掉四邊的順序,即左上右下,如下blend的屬性編輯器.

換個思路,你想把Margin的左上右下的順序變化就不可以了,因為這是類型轉換器,這個順序是定死的.如果用標記擴展的話,我們可以假設有下面的語法
{Margin Top=76,Left=76,Right=168,Bottom=0}
雖然感覺起來比直接寫xx,xx,xx,xx這樣麻煩,但增加了靈活性.主要問題是標記擴展可以記錄屬性值,類型轉換器只能用文本字符串表示.
一個復雜屬性在xaml的表示方法兩種方法都可以,標記擴展提供了一個多的選擇.看應用而定.當然在沒有類型轉換器的情況下,xaml也允許這樣寫法.相對而言就稍微的復雜一些,一切都是為了簡化.

<Button><Button.Margin><Thickness Left="0" Top="0" Right="0" Bottom="0"></Thickness></Button.Margin> </Button>

?

<Button Margin="{Margin Top=0,Left=0,Right=0,Bottom=0}" />
<Button Margin="0,0,0,0" />


比較上面三種方式,肯定最后一個最簡單,對于記憶不好的也可以嘗試第二種,其實第標記擴展也需要你記對象的屬性,萬一大小寫出錯那也麻煩,第一種嘛,代碼量又太多了,要是都設置一個屬性都這樣,那代碼就多了.所以各有各自的好處.

自定義標記擴展


標記擴展本身與設計時沒有關系,但類型轉換器卻是設計時必須的功能,二兩者又有著類似之處,所以這里介紹一下.

下面介紹自定義標記擴展的方法

(1)定義一個派生自System.Windows.Markup.MarkupExtension的類,該類要求重寫ProvideValue方法

namespace WPF.Controls {public class ThicknessExtension : MarkupExtension{public override object ProvideValue(IServiceProvider serviceProvider){throw new NotImplementedException();}} }



(2)與xml命名空間關聯(lián),在程序集項目中的AssemblyInfo添加元數(shù)據(jù),XmlnsDefinition元數(shù)據(jù)可以幫助統(tǒng)一命名空間,因為這樣我們才可以很簡單的使用wpf內(nèi)置控件(很多控件都在不同命名空間下),XmlnsPrefix的作用就如asp.net內(nèi)置控件以asp開始一樣<asp:Label />

[assembly: XmlnsDefinition("http://wpf.controls", "WPF.Controls")] [assembly: XmlnsPrefix("http://wpf.controls", "ext")]現(xiàn)在我們將ProvideValue方法變更為
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中添加的對象,都以默認的構造函數(shù)進來,同時可以用MarkupExtensionReturnType指定標記擴展返回的安全類型

[MarkupExtensionReturnType(typeof(Thickness))] public class ThicknessExtension : MarkupExtension {public override object ProvideValue(IServiceProvider serviceProvider){return new Thickness(Left,Top,Right,Bottom);}public ThicknessExtension(){}public double Bottom { get; set; }public double Left { get; set; }public double Right { get; set; }public double Top { get; set; } }

現(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未來之路 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/lonelyxmas/p/10129900.html

總結

以上是生活随笔為你收集整理的wpf中xaml的类型转换器与标记扩展的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。