熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

編寫與.NET屬性窗口交互的RAD組件(三)

2013-11-13 09:54:58  來源: .NET編程 

  編寫和顯示訂制的類型
  
  屬性窗口中的編輯有如下三種工作方式有些場合可以作為字符串來編輯然後由TypeConverter來實現類型的轉換可以顯示一個下拉列表來選擇值一個省略按鈕提供其他的UI界面來編輯值比如FileDialog和FontPicker我們已經講過了字符串形式接著我們就來看下拉列表
  
  NET framework已經包含了好幾種下拉列表的例子如ColorAccessibleRoleDock等屬性我們從下圖可以看到下拉列表的具體實現
   
  圖 下拉列表編輯器
  
  實現下拉的工作同樣是由TypeConverter來定義如果看TypeConverter的說明可以看到有三個虛函數來實現這個功能GetStandardValuesSupported()GetStandardValues()和GetStandardValuesExclusive()重載這些方法我們可以為屬性提供預先定義好的值列表實際上是TypeConverter實現了下拉列表中的枚舉值屬性窗口自己本身並沒有代碼來處理這種下拉列表的編輯而僅僅是使用TypeConverter的方法
  
  舉個例來說我們有一個包含Relation屬性的FamilyMember組件允許用戶選擇與其他人之間的關系如果要使設計時界面更友好的話屬性窗口應該使用下拉列表來提供一些常用值的選擇如motherfatherdaughter和sister等除了提供的常用值之外組件使用者也可以輸入其他的表示關系的字符串值
  
  public class FamilyMember : Component
  
  {
  
  private string relation = Unknown;
  
  [TypeConverter(typeof(RelationConverter))Category(Details)]
  
  public string Relation
  
  {
  
  get { return relation;}
  
  set { thisrelation = value;}
  
  }
  
  }
  
  internal class RelationConverter : StringConverter
  
  {
  
  private static StandardValuesCollection defaultRelations =
  
  new StandardValuesCollection(
  
  new string[]{Mother Father Sister
  
  Brother Daughter Son
  
  Aunt Uncle Cousin});
  
  public override bool GetStandardValuesSupported(
  
  ITypeDescriptorContext context)
  
  {
  
  return true;
  
  }
  
  public override bool GetStandardValuesExclusive(
  
  ITypeDescriptorContext context)
  
  {
  
  // returning false here means the property will
  
  // have a drop down and a value that can be manually
  
  // entered
  
  return false;
  
  }
  
  public override StandardValuesCollection GetStandardValues(
  
  ITypeDescriptorContext context)
  
  {
  
  return defaultRelations;
  
  }
  
  }
  
  不過如何做一個更加定制化的UI呢?我們可以使用UITypeEditor類UITypeEditor類包括了在顯示屬性或者是編輯屬性(比如下拉列表和省略按鈕)時可以由屬性窗口調用的方法
  
  一些類似於ImageColorFontName的屬性類型會在屬性值的左邊有一個小的圖形化表示這是通過重載UITypeEditor的PaintValue方法實現的當屬性窗口得到定義了編輯器的屬性值的時候它就提供給編輯器一個矩形框對象(Rectangle)和畫圖的對象(Graphic)他們都包含在PaintValue方法的事件參數PaintValueEventArgs中舉個例子來說我們有一個Grade類需要有圖形化的表示下面就是我們的Grade類
  
  [Editor(typeof(GradeEditor) typeof(SystemDrawingDesignUITypeEditor))]
  
  [TypeConverter(typeof(GradeConverter))]
  
  public struct Grade
  
  {
  
  private int grade;
  
  public Grade(int grade)
  
  {
  
  thisgrade = grade;
  
  }
  
  public int Value
  
  {
  
  get
  
  {
  
  return grade;
  
  }
  
  }
  
  }
  
  當我們輸入一個年齡的時候我們可以看到左邊的一個圖形表示
  
  圖 輸入年齡
  
  實現它並不困難注意到賦給Grade類的EditorAttribute特性它就是下面的這個類
  
  public class GradeEditor : UITypeEditor
  
  {
  
  public override bool GetPaintValueSupported(
  
  ITypeDescriptorContext context)
  
  {
  
  // let the property browser know wed like
  
  // to do custom painting
  
  return true;
  
  }
  
  public override void PaintValue(PaintValueEventArgs pe)
  
  {
  
  // choose the right bitmap based on the value
  
  string bmpName = null;
  
  Grade g = (Grade)peValue;
  
  if (gValue > )
  
  {
  
  bmpName = bestbmp;
  
  }
  
  else if (gValue > )
  
  {
  
  bmpName = okbmp;
  
  }
  
  else
  
  {
  
  bmpName = badbmp;
  
  }
  
  // draw that bitmap onto the surface provided
  
  Bitmap b = new Bitmap(typeof(GradeEditor) bmpName);
  
  peGraphicsDrawImage(b peBounds);
  
  bDispose();
  
  }
  
  }
  
  像我們上面提到的UITypeEditor可以實現屬性的下拉選擇和彈出對話框選擇後面的例子會包括這樣的代碼如果想知道進一步的信息的話就要參考UITypeEditorGetEditStyle和UITypeEditorEditValue方法以及IWindowsFormsEditorService接口
From:http://tw.wingwit.com/Article/program/net/201311/11959.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.