Дизайнерская сериализация и коллекция - PullRequest
1 голос
/ 12 мая 2010

У меня есть пользовательский элемент управления, который представляет сетку; и реализует другой пользовательский элемент управления. При открытии этого элемента управления в дизайнере, я могу использовать редактор коллекций, чтобы установить мою коллекцию. При сохранении; дизайнер успешно сохраняет мою коллекцию.

Однако при отбрасывании этого элемента управления на форме; это все еще (и должно) выставить (я) свойство коллекции, позволяющее мне изменять значения по умолчанию, как я определил в другом элементе управления.

Тем не менее, при сохранении этого дизайнера; он также пытается сохранить предопределенные элементы в коллекции; добавление значений по умолчанию при каждом сохранении.

Как лучше всего решить эту проблему? Я приложил пример кода.

Пример кода, в котором я определил свою коллекцию: 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;
}

1 Ответ

0 голосов
/ 06 января 2012

Мне не удалось найти лучший метод. Я решил придерживаться решения ниже.

{
    // 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...