2010-11-29 4 views
0

J'ai un contrôle utilisateur personnalisé qui déclenche une exception lorsque j'essaie de l'ajouter à la vue du concepteur. (More information on that bug here)Comment utiliser DesignerSerializerAttribute sur un contrôle utilisateur personnalisé?

On m'a dit que je devais dire au concepteur de ne pas reconnaître ce contrôle afin qu'il ne le sérialise pas. J'ai trouvé ce MSDN article qui semble faire ce que je veux. Je suppose que cela va réparer mon erreur, j'espère! :) (Si vous avez de meilleures idées s'il vous plaît laissez-moi savoir comment résoudre ce bug.)

Comment puis-je ajouter cette métadonnée à ma classe à Caché ou Contenu? Merci!

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 
    } 
} 

EDIT: Après des conseils ici, j'ajouté en haut de la classe, mais je reçois une erreur lors de la compilation.

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); 
     } 

erreur est:

Error 1 Attribute 'DesignerSerializationVisibility' is not valid on this declaration type. It is only valid on 'method, property, indexer, field, event' declarations. C:\Users\Sergio.Tapia\documents\visual studio 2010\Projects\WinformsPlayground\WinformsPlayground\HorizontalPictureScroller.cs 15 6 WinformsPlayground

+0

double possible de [Visual Studio déclenche une erreur lorsque je fais glisser mon contrôle utilisateur sur le point de vue du design.] (Http: // stackoverflow.com/questions/4304276/visual-studio-fires-an-error-when-i-drag-my-user-control-onto-the-design-view) –

+0

Eh bien, j'ai lié la question en haut, en disant que c'est un duplicata est une sorte de myope. C'est une autre question complètement. –

Répondre

0

Je ne sais pas, mais il peut être étouffais sur votre liste sérialisable publique des images. Juste pour le test, je voudrais essayer d'ajouter ce qui suit immédiatement au-dessus celui-ci propriété votre classe

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]

Je crois que si vous faites caché, il ne le fera pas une valeur modifiable à partir de la feuille de propriétés, et n'essaiera donc pas réellement d'écrire le contenu de la sérialisation de l'objet.

+0

S'il vous plaît voir modifier. Je reçois cette erreur: Erreur L'attribut 'DesignerSerializationVisibility' n'est pas valide pour ce type de déclaration. Il n'est valable que sur les déclarations 'méthode, propriété, indexeur, champ, événement'. \t C: \ Users \ Sergio.Tapia \ documents \ Visual Studio 2010 \ Projects \ WinformsPlayground \ WinformsPlayground \ HorizontalPictureScroller.cs WinformsPlayground –

+0

@Serg, il semble que ma recommandation a travaillé pour vous ... le plaçant au-dessus de la "PROPERTY" dans votre classe ... Était-ce en fait la solution à votre problème d'interface de concepteur? Il semble que c'est ce qui a été posté dans votre question suivante sur la suppression de la mauvaise image. – DRapp

+0

Oui, ça a marché. Merci encore pour votre temps. –

0

J'ai essayé ce qui suit et semble fonctionner OK pour moi:

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 
    { 
         ....... 
    } 
Questions connexes