2010-11-29 9 views
0

Ich habe ein benutzerdefiniertes Benutzersteuerelement, das eine Ausnahme auslöst, wenn versucht wird, es der Designeransicht hinzuzufügen. (More information on that bug here)Wie kann DesignerSerializerAttribute für ein benutzerdefiniertes Benutzersteuerelement verwendet werden?

Mir wurde gesagt, dass ich dem Entwerfer erklären muss, diese Kontrolle nicht zu bestätigen, also es nicht serialize. Ich habe dieses MSDN article gefunden, das zu tun scheint, was ich will. Ich nehme an, das wird hoffentlich meinen Fehler beheben! :) (Wenn Sie bessere Ideen haben, lassen Sie mich bitte wissen, wie Sie diesen Fehler beheben können.)

Wie kann ich diese Metadaten zu meiner Klasse zu Hidden oder Content hinzufügen? Vielen Dank!

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: Nach Beratung hier habe ich diese an die Spitze der Klasse, aber ich erhalte eine Fehlermeldung beim Kompilieren.

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

Fehler ist:

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

möglich Duplikat [Visual Studio feuert einen Fehler, wenn ich meine Benutzersteuerung auf die Entwurfsansicht ziehen.] (Http: // stackoverflow.com/questions/4304276/visual-studio-fires-an-error-when-i-drag-my-user-control-onto-the-design-view) –

+0

Nun, ich verknüpfte die Frage oben, so zu sagen, es ist ein Duplikat ist kurzsichtig. Dies ist eine andere Frage vollständig. –

Antwort

0

Ich bin nicht sicher, aber es kann auf Ihrer öffentlichen serializable Liste der Bilder ersticken. Nur für die Prüfung, würde ich versuchen, die folgenden unmittelbar über diese Eigenschaft auf Ihrer Klasse

[DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]

ich das Hinzufügen glauben, wenn man es versteckt machen, wird es nicht machen ein editierbarer Wert aus dem Eigenschaftenblatt und versucht daher nicht, den Serialisierungsinhalt des Objekts zu schreiben.

+0

Bitte siehe bearbeiten. Ich erhalte diesen Fehler: Fehler Das Attribut 'DesignerSerializationVisibility' ist für diesen Deklarationstyp nicht gültig. Es ist nur gültig für 'method, property, indexer, field, event' Deklarationen. \t C: \ Benutzer \ Sergio.Tapia \ Dokumente \ Visual Studio 2010 \ Projects \ WinformsPlayground \ WinformsPlayground \ HorizontalPictureScroller.cs WinformsPlayground –

+0

@Serg, es sieht aus wie meine Empfehlung für Sie gearbeitet ... es über die Platzierung "PROPERTY" in Ihrer Klasse ... War das tatsächlich die Lösung für Ihr Designer-Interface-Problem? Es sieht so aus, als ob das in Ihrer nachfolgenden Frage zum Löschen des falschen Bildes gepostet wurde. – DRapp

+0

Ja, das hat funktioniert. Nochmals vielen Dank für Ihre Zeit. –

0

Ich habe versucht, die folgende und scheint für mich OK zu arbeiten:

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 
    { 
         ....... 
    } 
Verwandte Themen