2010-05-12 38 views
1

我有一個代表網格的自定義控件;並實現另一個自定義控件。 在設計師中打開此控件時,我可以使用集合編輯器來設置我的集合。保存時;設計師成功保存了我的收藏。設計器序列化和集合

但是,在窗體上放置此控件時;它仍然(也應該)暴露集合屬性,允許我修改默認值,如我在其他控件中定義的那樣。

但是;當保存這位設計師時;它也會嘗試將預定義的項目存儲在集合中;每次保存添加默認的。

解決此問題的最佳方法是什麼?我附上了一個代碼示例。

在那裏我有我的定義收集

代碼示例: GridPicture.cs

[Category("Layout")] 
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] 
    [Editor(typeof(CollectionEditor), typeof(UITypeEditor))] 
    public GridPictureColumnDefinitionCollection ColumnDefinitions 
    { 
     // The DesignerSerializationVisibility attribute instructs the design editor to serialize the contents of the collection to source code. 
     // This will place all the code required to add the items to a collection variable of GridPictureColumnDefinitionCollection. 
     get 
     { 
      return m_ColumnDefinitions; 
     } 
    } 
該網格的我的第一個「執行」的

生成的設計代碼; Picture1.cs

 VGTest.GridPictureColumnDefinition gridPictureColumnDefinition1 = new VGTest.GridPictureColumnDefinition(); 
     VGTest.GridPictureColumnDefinition gridPictureColumnDefinition2 = new VGTest.GridPictureColumnDefinition(); 
     VGTest.GridPictureRowDefinition gridPictureRowDefinition1 = new VGTest.GridPictureRowDefinition(); 
     gridPictureColumnDefinition1.Auto = true; 
     gridPictureColumnDefinition1.Value = 0F; 
     gridPictureColumnDefinition2.Auto = true; 
     gridPictureColumnDefinition2.Value = 0F; 
     this.ColumnDefinitions.Add(gridPictureColumnDefinition1); 
     this.ColumnDefinitions.Add(gridPictureColumnDefinition2); 
     gridPictureRowDefinition1.Auto = true; 
     gridPictureRowDefinition1.Value = 0F; 
     this.RowDefinitions.Add(gridPictureRowDefinition1); 

代碼示例,當我把這張圖片1放在另一張圖片; picture2.cs :(注意picture11是picture1,因爲它是picture1的第一個;)

VGTest.GridPictureColumnDefinition gridPictureColumnDefinition1 = new VGTest.GridPictureColumnDefinition(); 
      VGTest.GridPictureColumnDefinition gridPictureColumnDefinition2 = new VGTest.GridPictureColumnDefinition(); 
      VGTest.GridPictureColumnDefinition gridPictureColumnDefinition3 = new VGTest.GridPictureColumnDefinition(); 
      VGTest.GridPictureRowDefinition gridPictureRowDefinition1 = new VGTest.GridPictureRowDefinition(); 
// Some code removed that does the Auto and Value settings as above 
      this.picture11.ColumnDefinitions.Add(gridPictureColumnDefinition1); 
      this.picture11.ColumnDefinitions.Add(gridPictureColumnDefinition2); 
      this.picture11.ColumnDefinitions.Add(gridPictureColumnDefinition3); 

picture2 control;當它重新生成InitializeComponent()方法時;現在添加了我在picture1中添加的columndefinitions。

我寫了這個臨時的解決辦法的問題:

{ 
    // This makes sure column definitions are only serialized when configured at a implementation of this GridPicture. 
    // This is a Quick/Dirty fix for the following problem: 
    // When MyPanel (:GridPicture) is put on PanelContainer(:Picture); the picture designer (re)serializes this each save. 
    return this.GetType().BaseType.Name == typeof(Picture).Name; 
} 

回答

0

我無法找到一個更好的方法。我決定堅持下面的解決方案。

{ 
    // This makes sure column definitions are only serialized when configured at a implementation of this GridPicture. 
    // This is a Quick/Dirty fix for the following problem: 
    // When MyPanel (:GridPicture) is put on PanelContainer(:Picture); the picture designer (re)serializes this each save. 
    return this.GetType().BaseType.Name == typeof(Picture).Name; 
} 
+0

在幾年後閱讀這個後,我現在會使常數值,而不是每次使用反射檢查。 – Aphelion 2016-02-19 16:49:21