У меня есть пользовательский элемент управления, который представляет сетку; и реализует другой пользовательский элемент управления.
При открытии этого элемента управления в дизайнере, я могу использовать редактор коллекций, чтобы установить мою коллекцию. При сохранении; дизайнер успешно сохраняет мою коллекцию.
Однако при отбрасывании этого элемента управления на форме; это все еще (и должно) выставить (я) свойство коллекции, позволяющее мне изменять значения по умолчанию, как я определил в другом элементе управления.
Тем не менее, при сохранении этого дизайнера; он также пытается сохранить предопределенные элементы в коллекции; добавление значений по умолчанию при каждом сохранении.
Как лучше всего решить эту проблему? Я приложил пример кода.
Пример кода, в котором я определил свою коллекцию:
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 - это картинка1, так как она является первой из картинки1;)
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; когда он восстанавливает метод InitializeComponent (); теперь добавляет определения столбца, которые я добавил в picture1.
Я написал это временное исправление для проблемы:
{
// 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;
}