程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> wpf控件設計時支持(1)

wpf控件設計時支持(1)

編輯:關於.NET

1.屬性元數據

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

若你之前在.net平台下做過控件開發,你應該知道這些功能是通過屬性元數據實現的,比如使用Category元數據,把Content屬性分到Content類別下.

[Category("Content")]
public object Content { get; set; }

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

public class DesginCustomControl : ContentControl
{
  [Category("Content")]
  public string Content
  {
    get { return (string)GetValue(ContentProperty); }
    set { SetValue(ContentProperty, value); }
  }
  public static readonly DependencyProperty ContentProperty =
    DependencyProperty.Register("Content", typeof(string), typeof(DesginCustomControl), new UIPropertyMetadata(String.Empty));
 
}

效果如下:

2.屬性元數據集合

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
{
  public void Register()
  {
    AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
    MainBuilder.AddCustomAttributes(typeof(DesginCustomControl),DesginCustomControl.ContentProperty,new Attribute[]{
           new CategoryAttribute("Content")});
    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
{
  public void Register()
  {
    AttributeTableBuilder MainBuilder = new AttributeTableBuilder();
    MainBuilder.AddCallback(
       typeof(DesginCustomControl),
       delegate(AttributeCallbackBuilder builder)
       {
         builder.AddCustomAttributes(DesginCustomControl.ContentProperty, new Attribute[]{
           new CategoryAttribute("Content")});
        
       });
    MetadataStore.AddAttributeTable(MainBuilder.CreateTable());
  }
}

是不是感覺很無聊,為了這麼個東西還要去研究:),覺得的有用的就看一下吧

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved