Entwickler-Ecke

WinForms - User Control Designer erben.


Kasko - Sa 10.10.20 19:30
Titel: User Control Designer erben.
Wenn ich eine Standard User Control Erweitern möchte muss ich es bisher so machen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public class NoFocusCueButton : Button {
    protected override bool ShowFocusCues => false;
}

public class BringToFrontButton : NoFocusCueBotton {
    [EditorBrowsable(EditorBrowsableState.Always)]
    [Browsable(true)]
    [DefaultValue(null)]
    [Category("Behavior")]
    [Description("The target this button should bring to front.")]
    public Control Target { get; set; }

    public BringToFrontButton() {
        this.Click += delegate (object sender, EventArgs e) {
            Target.BringToFront();
        };
    }
}


Das Problem ist, dass ich so diese Buttons nicht über den Designer hinzufügen kann. Wenn ich jetzt jedoch eine User Control hinzufüge und keine Klasse kann ich sie über den Designer hinzufügen, aber sie ist ja dann kein Button. Ich müsste also einen komplett eigenen Button definieren und kann nicht einfach den bestehenden erweitern. Wenn ich die Vererbung von UserControl zu Button ändere ist es wieder nicht möglich.

Wie kann ich also eine Control erweitern und zusätzlich den Designer "erben" um diese Control auch über den Designer hinzufügen zu können.


Christian S. - Sa 10.10.20 21:49

Hallo,

wenn ich Dich richtig verstanden habe, kann ich Dein Problem nicht reproduzieren.
Habe mal einen Screenshot von dem gemacht, was ich probiert habe: Designer mit Custom Button (PNG, 62.84 KB)

Zwei Klasse, die letzten Endes von Button erben und nach einmaligem Bauen des Projektes in der Toolbox erscheinen und benutzbar sind, wie jeder andere Button auch.

Ich verwende die Visual Studio 2019 (Version 16.7.5)

Ansonsten kann man mit Rechtsklick auf die Toolbox und dann "Choose Items ..." Elemente zur Toolbox hinzufügen. Dort kann man auch Assemblies wählen, in denen gesucht werden soll, dort könntest Du Dein gebautes Projekt auswählen.

Grüße
Christian


Palladin007 - Sa 10.10.20 22:35

Zitat:
[...] nach einmaligem Bauen des Projektes [...]


Das dürfte der entscheidende Punkt sein - mach mal einen Rebuild, dann sollte es gefunden werden.
Ich könnte mir vorstellen, dass VisualStudio ohne vorherigen Build zwar die Dateien absucht, aber zu gunsten der Performance nur nach ein paar ausgewählten Basisklassen sucht und nicht alles analysiert. Mit einem fertigen Build sieht das natürlich anders aus, da funktioniert wieder Reflection, was weit performanter funktioniert, als Quellcode-Analyse.


Kasko - Sa 10.10.20 23:14

Habe die Lösung schon über Stackoverflow gefunden. Das Problem habe ich aber immer nicht nicht verstanden. Natürlich habe ich nach dem Hinzufügen der Klassen und nach Änderungen an diesen einen Build bzw. Rebuild ausgeführt. Die Lösung war das Hinzufügen des ToolboxItem-Attributes (Constructor mit Type):


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
[ToolboxItem(typeof(NoFocusCueBotton))]
public class NoFocusCueBotton : Button {

}

[ToolboxItem(typeof(BringToFrontButton))]
public class BringToFrontButton : NoFocusCueBotton {

}


Warum dies jetzt notwendig war weiß ich aber immer noch nicht.

Wenn ihr es euch durchlesen wollt, hier der Stackoverflow-Beitrag: https://stackoverflow.com/questions/64296877/inherit-user-control-designer

Edit:

Und zu allem Überfluss werden jetzt alle Controls gar nicht mehr in der Toolbox angezeigt, obwohl ich nichts am Projekt geändert habe. Auch nach hunderten Rebuilds, Neustart von VS, Zurücksetzen der Toolbox, etc. Und ja Automatically Populate Toolbox ist True. In einem neuen Projekt funktioniert die Toolbox aber es kann ja nicht sein, dass ich ständig ein neues Projekt erstllen muss, in welches ich den vorhandenen Code einfüge. Das ist ja auch nicht mit einem GitHub-Repo zu vereinbaren.