C# - Lock-WinForm-Controls
In einem Programm, das ich geschrieben habe, können Benutzer hinzufügen von Steuerelementen zum Formular, und verschieben Sie Sie um und legen Sie einige Eigenschaften in einer pseudo-design-Modus. Ich möchte in der Lage sein, um lock all diese Elemente in einem Ort, wenn Sie eine Taste drücken, wechseln Sie zu "Daten-Modus". Wie kann ich dies tun? Ich wollte in der Lage sein, um eine Schleife durch alle controls und verwenden Sie die Eigenschaft Sperren, aber ich bemerkte es nicht zeigen, bis in intellisense.
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich gehe davon aus, dass durch die "pseudo-design-Modus" Sie bedeuten, dass Ihre Anwendung ist in einer run-time-Zustand und der end-Benutzer erleben eine "virtuelle design-Modus" : bitte korrigieren Sie mich, wenn ich falsch bin.
Aber, ich nehme an Sie beziehen sich auf die design-time 'Locked-Eigenschaft steuert, und dass Sie möchten, zu "emulieren" diese zur Laufzeit ... richtig ?
Ich bin auch davon anfügen Maus up/down/move-Handler, um die Steuerelemente, die Sie erlauben, sich zu bewegen, wahrscheinlich, indem die Schleife durch alle oder eine Teilmenge von, die Steuerelemente auf dem Formular (oder einer Sammlung sind Sie der Aufrechterhaltung der Steuerelemente verschoben werden darf).
Wenn meine Annahmen korrekt sind, ich würde für das entfernen der event-Handler, die es ermöglichen, sich zu bewegen, wenn Sie brauchen, um zu deaktivieren Steuerung der Bewegung, dann Wiederherstellung dieser event-Handler, wenn Sie möchten, dass die Steuerelemente, um wieder bewegt werden.
Einen Hauptgrund ist, dass es ist, imho, "best practice" - Steuerelement-Ereignis-Handhabung konsequent (ohne event-Handler "in-place" stören können, mit dem Objekt-Entsorgung ... obwohl, dass kann in keiner Weise, gelten für Ihr Szenario hier).
Eine weitere Idee : haben Sie einen "unsichtbaren" Panel angedockt 'zu füllen das Formular : in diesem Bedienfeld sind alle Bedienelemente, die verschoben werden können : dies kann Ihnen erlauben, mehr leicht zu "verfeinern Sie Ihren Fokus" auf die Steuerelemente, die Sie "verbringen" mit diesem zusätzlichen code auf. Die Nachteile bei der Verwendung dieses Ansatzes sind in der Regel :
wenn Sie hostingForm.ActiveControl ermitteln, welche Steuern habe die mousedown (und damit kann dann verschoben werden) : finden Sie einige Steuerelemente, wie Beschriftungen und PictureBox hinzu, die nicht zu tun, die activecontrol-von der form, wenn darauf geklickt, aber die meisten tun.
haben Sie ein "z-order" - Sache zu denken, da eine Kontrolle nicht in Ihrem panel Kapselung der Steuerelemente, die Sie wünschen, um zu ermöglichen, bewegen sich geschickt hinter der pseudo-transparenten panel ausgeblendet werden.
Aus diesen Gründen, imho, ich denke, deaktivieren und re-aktivieren der event-handler Anhängen, am besten ist, die meisten einfach, und da kann es dann geschehen, wenn die Kontrollen sind "down-cast", zu deren Steuerung "Identität" :
Ich benutze es auf diese Weise.
best, Bill
Die Locked-Eigenschaft ist keine wirkliche Eigenschaft -- es wird Hinzugefügt, die von der Windows Forms-designer (wie die Generate-Mitglied und Modifikatoren "Eigenschaften"). Sie müssten daher simulieren Sie es selbst, entweder auf der Ebene oder (falls erforderlich) auf der control-Ebene (sagen wir mit einem Wörterbuch, die Bedienelemente sind gesperrt), und prüfen Sie manuell, ob es in dem code, den Sie geschrieben habe, für die Bewegung kontrolliert um.
MSDN
Ich denke, es ist ein sichtbar -, um-designer-only-Eigenschaft. Ich denke, Sie würde haben, um Ihre eigenen freeze-Mechanismus - eine kleine Flagge zum Umschalten zwischen der Design-und Betriebs-Modi.
Update: Es scheint, dass die benutzerdefinierte designer-Klassen können Eigenschaften hinzufügen, um Steuerelemente basierend auf, ob Sie im Design-Modus ist oder nicht.
Mehr details finden Sie hier, wenn Sie beabsichtigen, nehmen die VS architektonischen hammer Weg. In jedem Fall lohnt sich 10 Minuten Zeit Lesung.
Benutzerdefinierten Entwurfszeit-Steuerelement-Features in Visual Studio .NET - Dino Esposito