Как использовать DesignerSerializerAttribute в пользовательском элементе управления? - PullRequest
0 голосов
/ 29 ноября 2010

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

Мне сказали, что я должен сказать конструктору не признавать этот элемент управления, чтобы он не сериализовал его. Я нашел эту статью MSDN , которая, кажется, делает то, что я хочу. Надеюсь, это исправит мою ошибку! :) (Если у вас есть лучшие идеи, пожалуйста, дайте мне знать, как исправить эту ошибку.)

Как я могу добавить эти метаданные в мой класс в Hidden или Content? Спасибо!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections.ObjectModel;
using System.Runtime.Serialization;
using System.ComponentModel.Design.Serialization;

namespace WinformsPlayground
{
    [DesignerSerializerAttribute()] //THE QUESTION IS HERE!
    public partial class HorizontalPictureScroller : UserControl
    {
        public HorizontalPictureScroller()
        {
            InitializeComponent();
            Pictures = new ObservableCollection<SelectablePicture>();
            Pictures.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Pictures_CollectionChanged);
        }       

        #region "Properties"
        public ObservableCollection<SelectablePicture> Pictures { get; set; }
        private int PositionControlX = 0;
        #endregion

        #region "Methods"
        private void RedrawPictures()
        {
            PositionControlX = 0;

            foreach (var picture in Pictures)
            {
                picture.Location = new Point(PositionControlX + panelPicturesWrapper.AutoScrollPosition.X, 0);
                PositionControlX += 130;
                panelPicturesWrapper.Controls.Add(picture);
            }
        }

        public void AddPicture(SelectablePicture picture)
        {
            Pictures.Add(picture);
        }

        public void RemovePicture(SelectablePicture picture)
        {
            Pictures.Remove(picture);
        }

        public void MovePictureLeft(int index)
        {
            SelectablePicture tmpPicture = Pictures[index];
            Pictures[index] = Pictures[index - 1];
            Pictures[index - 1] = tmpPicture;
        }

        public void MovePictureRight(int index)
        {
            SelectablePicture tmpPicture = Pictures[index];
            Pictures[index] = Pictures[index + 1];
            Pictures[index + 1] = tmpPicture;
        }
        #endregion

        #region "Events"
        void Pictures_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
        {
            RedrawPictures();
        }
        #endregion
    }
}

РЕДАКТИРОВАТЬ: Следуя совету здесь, я добавил это в начало класса, но я получаю ошибку при компиляции.

namespace WinformsPlayground
{
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    public partial class HorizontalPictureScroller : UserControl
    {
        public HorizontalPictureScroller()
        {
            InitializeComponent();
            Pictures = new ObservableCollection<SelectablePicture>();
            Pictures.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(Pictures_CollectionChanged);
        }  

Ошибка:

Атрибут ошибки 1 «DesignerSerializationVisibility» является недопустимо в этом типе объявления. Это действительно только для метода, свойства, индексатор, поле, событие деклараций. C: \ Users \ Sergio.Tapia \ документы \ визуальный студия 2010 \ Projects \ WinformsPlayground \ WinformsPlayground \ HorizontalPictureScroller.cs 15 6 WinformsPlayground

Ответы [ 2 ]

0 голосов
/ 29 ноября 2010

Я попробовал следующее и, кажется, работает нормально для меня:

internal class HorizontalPictureScrollerSerializer : CodeDomSerializer
    {
        public override object Deserialize(IDesignerSerializationManager manager, object codeObject)
        {
            var baseClassSerializer = (CodeDomSerializer) manager.
                                                              GetSerializer(
                                                                  typeof (HorizontalPictureScroller).BaseType,
                                                                  typeof (CodeDomSerializer));

            return baseClassSerializer.Deserialize(manager, codeObject);
        }

        public override object Serialize(IDesignerSerializationManager manager, object value)
        {

            var baseClassSerializer = (CodeDomSerializer) manager.GetSerializer(
                                                                  typeof (HorizontalPictureScroller).BaseType,
                                                                  typeof (CodeDomSerializer));

            object codeObject = baseClassSerializer.Serialize(manager, value);


            return codeObject;
        }
    }

    [DesignerSerializerAttribute(typeof (HorizontalPictureScrollerSerializer), typeof (CodeDomSerializer))]
    //THE QUESTION IS HERE!
    public partial class HorizontalPictureScroller : UserControl
    {
                         .......
    }
0 голосов
/ 29 ноября 2010

Я не уверен, но он может задыхаться в вашем общедоступном сериализуемом списке картинок.Просто для тестирования, я бы попытался добавить следующее непосредственно над этим свойством в вашем классе

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...