wpf控制項設計時支援 1

2021-09-08 05:28:02 字數 2544 閱讀 9323

原文:

wpf控制項設計時支援(1)

這部分內容幾乎是大家忽略的內容,我想還是來介紹一下.

在vs ide中,在asp.net,winfrom等開發環境下,右側的propertygrid屬性面板,會對屬性進行分類,這有利於了解控制項屬性的用途.

若你之前在.net平台下做過控制項開發,你應該知道這些功能是通過屬性元資料實現的,比如使用category元資料,把content屬性分到content類別下.

[category("content")]

public object content

這種方法在開發wpf自定義控制項依然可用.我們以名為desgincustomcontrol的自定義控制項為例子.因為是wpf控制項,所以屬性變更為依賴項屬性.

public class 

desgincustomcontrol : contentcontrol

set

}public static readonly

dependencyproperty contentproperty =

dependencyproperty.register("content", typeof(string), typeof(desgincustomcontrol), new

uipropertymetadata(string.empty));

}

效果如下:

wpf的設計時允許我們將這些元資料與控制項屬性分離出來.下面我們來實現乙個簡單的功能

2.1新建乙個設計時支援的單獨專案

wpf.controls是控制項專案,wpf.controls.visualstudio.design是控制項設計時專案

注意:

(1)程式集命名約定

設計時的程式集是有命名約定的,這樣才可以受到visualstudio的支援.如控制項程式集是wpf.controls,那麼設計時程式集則是

控制項程式集的名字+visualstudio.design

(2)設計時程式集編譯位置

設計時程式集必須與控制項存放在同個目錄下才能工作,引用控制項的專案無需引用設計時程式集

假設wpf.controls的編譯目錄沒有做變更的話,那麼wpf.controls.visualstudio.design這個專案編譯好後是存在在wpf.controls的bin目錄下面的.

(3)引用microsoft.windows.design程式集

microsoft.windows.design是wpf設計時支援的基礎,所以要引用這個程式集

2.2註冊屬性的元資料集合

實現乙個名為iregistermetadata的介面。來看一下**

public class 

wpfcontrolscommonmetadata : iregistermetadata

); metadatastore.addattributetable(mainbuilder.createtable());}}

attributetablebuilder是屬性元資料表,msdn是解釋屬性表.attributetablebuilder有多個addcustomattributes過載方法.可以將元資料附加到屬性上.比如上面**給desgincustomcontrol的content屬性新增了乙個categoryattribute元資料.新增完畢以後再通過

metadatastore的addattributetable方法新增屬性元資料表.metadatastore稱之為元資料儲存區.

以上**的實現與在控制項上直接掛元資料標籤效果是一樣.有什麼不同點呢?

若我們為asp.net的內建控制項擴充套件設計時的話,則必須繼承該控制項.這裡便不會有這個問題,兩者是完全分離的.

2.3延遲新增屬性元資料

上面的示例,直接在mainbuilder類中為控制項新增元資料,當為比較多的控制項新增元資料時,同時載入會出現效能問題,所以mainbuilder還提供了addcallback方法,當需要時,才會為控制項新增元資料.現以上示例**變更如下

public class 

wpfcontrolscommonmetadata : iregistermetadata

);

});metadatastore.addattributetable(mainbuilder.createtable());}}

是不是感覺很無聊,為了這麼個東西還要去研究:),覺得的有用的就看一下吧,這篇就寫這麼多,寫完就差不多可以放假回家了.

如何讓復合控制項的子控制項獲得設計時支援

假如乙個復合控制項由乙個toolstript和乙個textbox組成,如何使toolstript獲得設計時支援,在設計時可以像使用普通toolstript一樣新增 刪除控制項?直接把toolstript設為public是無法達到目的的。必須定義乙個用於為元件實現設計時服務的designer desi...

wpf設定設計時的ViewModel

原文 wpf設定設計時的viewmodel wpf mvvm開發中,有些情況下,你的view不一定設定datacontext,但是你又想在設計階段,能夠自動提示你的view繫結的viewmodel的內容,這個時候可以通過d datacontext屬性來設定 d datacontext 在你的view...

wpf自定義計時器控制項

最近要用到乙個計時功能,所以臨時寫了乙個控制項,以備以後再次使用,不夠完善,但功能算是實現了.效果圖如下 分割線 步驟 1.新建乙個類庫,名為wpfcustomcontrols 或其它,下同 刪除預設的cs檔案.新增乙個theme資料夾,在theme資料夾下新建乙個資源字典名為generic.xam...