29 Stimmen

Wie aktiviert man die Designunterstützung in einem benutzerdefinierten Steuerelement?

Ich werde versuchen zu erklären, worum es mir geht. Ich weiß nicht, den technischen Begriff für sie, so geht hier:

Beispiel 1: Wenn ich eine ListView auf einem Formular platziere und einige Spalten hinzufüge, kann ich in der Entwurfszeit die Spalten anklicken und ziehen, um ihre Größe zu ändern.

Beispiel 2: Ich platziere eine ListView in einem UserControl und nenne sie "MyCustomListView" (und füge vielleicht eine Methode hinzu, um sie irgendwie zu erweitern).

Wenn ich nun die "MyCustomListView" auf einem Formular platziere, kann ich die Spaltenüberschriften nicht anklicken und ziehen, um ihre Größe in der Entwurfszeit zu ändern.

Gibt es eine Möglichkeit, dies auf einfache Weise zu erreichen? Eine Form von "Übergeben Sie das Klick- und Zieh-Ereignis an das darunter liegende Steuerelement und lassen Sie dieses Steuerelement seine Arbeit tun". . Im nicht wirklich suchen, um zu rekodieren, übergeben Sie einfach auf den Mausklick (oder was auch immer es ist) und lassen Sie die, in diesem Fall, ListView reagieren, wie es im ersten Beispiel oben tat.

64voto

Hans Passant Punkte 894572

Der Windows Forms Designer hat für die meisten Steuerelemente eigene Designerklassen. Der Designer für eine ListView ist System.Windows.Forms.Design.ListViewDesigner, eine interne Klasse in der System.Design.dll Assembly. Diese Klasse gibt Ihnen die Möglichkeit, die Spaltenüberschriften zu ziehen.

Ein UserControl verwendet die Designerklasse System.Windows.Forms.Design.ControlDesigner. Es macht nichts Besonderes, sondern legt nur ein Rechteck um das Steuerelement mit Ziehpunkten. Sie sehen, worauf das hinausläuft: Nachdem Sie Ihr Benutzersteuerelement auf einem Formular platziert haben, wird ControlDesigner verwendet, um die Klasse zu entwerfen, ListViewDesigner ist nicht im Spiel. Sie verlieren also die Möglichkeit, die Spaltenüberschriften zu ziehen. Beachten Sie auch, dass ControlDesigner keinen Zugriff auf die Steuerelemente innerhalb der UC gibt.

Das lässt sich jedoch beheben, indem Sie einen eigenen Designer erstellen. Starten Sie mit Projekte + Verweis hinzufügen, wählen Sie System.Design. Sie müssen dem UC eine öffentliche Eigenschaft hinzufügen, um die Listenansicht sichtbar zu machen und das Attribut [DesignerSerializationVisibility] anwenden, damit geänderte Eigenschaften gespeichert werden können. Und wenden Sie das Attribut [Designer] auf die UC-Klasse an, um den Standarddesigner zu ersetzen. Das Ganze sollte folgendermaßen aussehen (unter Verwendung der Standardnamen und einer Listenansicht, die "Mitarbeiter" anzeigt):

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;   // Note: add reference required: System.Design.dll

namespace WindowsFormsApplication1 {
    [Designer(typeof(MyDesigner))]   // Note: custom designer
    public partial class UserControl1 : UserControl {
        public UserControl1() {
            InitializeComponent();
        }

        // Note: property added
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ListView Employees { get { return listView1; } }
    }

    // Note: custom designer class added
    class MyDesigner : ControlDesigner {
        public override void Initialize(IComponent comp) {
            base.Initialize(comp);
            var uc = (UserControl1)comp;
            EnableDesignMode(uc.Employees, "Employees");
        }
    }
}

Die Listenansicht in der Benutzersteuerung kann nun wie gewohnt angeklickt und gestaltet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X