C # typisierte T Benutzersteuerung im Entwurfsmodus gibt einen Fehler

7

Ich habe eine benutzerdefinierte Klasse, die von UserControl abgeleitet ist. Der Code:

%Vor%

Diese Klasse funktioniert wie es soll. Aber wenn ich versuche, den Design-Modus des Formulars zu betreten, das diese Gallery -Klassen enthält, gibt es mir Fehler:

  
  • Der Typ 'PresentrBuilder.Forms.Gallery' konnte nicht gefunden werden.   Bitte stellen Sie sicher, dass die Baugruppe   das enthält diesen Typ ist referenziert.   Wenn dieser Typ ein Teil Ihres ist   Entwicklungsprojekt, stellen Sie sicher, dass   Das Projekt wurde erfolgreich abgeschlossen   gebaut.

  •   
  • Die Variable 'pictureGallery' ist entweder nicht deklariert oder wurde nie angezeigt   zugewiesen.

  •   

Hinweis: ( pictureGallery ist tatsächlich ein Gallery<PictureElement> ).

Wie kann das gelöst werden? Auf diese Weise kann ich nicht im Entwurfsmodus arbeiten, was die Erstellung meiner Benutzerschnittstelle ziemlich schwierig macht.

    
MysticEarth 17.12.2009, 08:48
quelle

4 Antworten

12

Der Designer hasst (d. h. unterstützt keine generischen Steuerelemente) und das wird sich in absehbarer Zeit nicht ändern, also tu das nicht. Betrachten Sie stattdessen eine Eigenschaft (oder eine ähnliche), die ein Type akzeptiert, und arbeiten Sie zur Laufzeit (Reflektion usw.) - oder: verwenden Sie den Designer nicht.

Zum Beispiel, wenn Sie:

%Vor%

Sie können verwenden:

%Vor%

Dies wird Ihnen alles geben, was Sie gerade haben ( new , IElement , etc) - aber es kann einfach keine Validierung während der Kompilierung durchführen.

    
Marc Gravell 17.12.2009, 08:54
quelle
11

In diesem Fall ist es am einfachsten, eine leere Unterklasse zu erstellen, die den generischen Parameter qualifiziert.

Dies wird oft mit der ObservableCollection gemacht:

%Vor%

Es ist irgendwie irritierend, aber es kann Ihre Probleme lösen.

    
Egor 17.12.2009 08:58
quelle
3

Wie die anderen bereits erwähnt haben, hat der Visual Studio Designer viele Probleme beim Umgang mit Generics in Controls. Ich bin selbst auf dieses Problem gestoßen, als ich versuchte, so etwas wie eine generische "Property Viewer" -Klasse zu implementieren.

Die Lösung, die für mich funktionierte, war, eine Zwischenklasse zu definieren, wie Egor sagte. Wenn ich Ihre Frage richtig verstehe, sollte das für Ihre Situation etwa so aussehen:

%Vor%

Verwenden Sie dann die PictureElementGallery in Ihrem Formular statt Galerie & lt; PictureElement & gt; . Der Designer sollte damit keine Probleme haben.

    
M-Peror 17.12.2009 09:54
quelle
1

Statt ein generisches Steuerelement zu haben, muss das Steuerelement mit einer generischen Klasse interagieren, die vom Steuerelement selbst getrennt ist. Übergeben Sie diese Klasse dann an das Steuerelement.

    
Gregory 17.12.2009 09:06
quelle