Ist es im Anschluss an diese Frage möglich, innerhalb des Konstruktors eines Objekts zu erkennen, ob sich jemand im Entwurfs- oder Laufzeitmodus befindet?
Mir ist klar, dass dies möglicherweise nicht möglich ist und ich ändern muss, was ich will, aber im Moment interessiert mich diese spezielle Frage.
ISite.DesignMode
.Suchen Sie so etwas:
Sie können dies auch tun, indem Sie den Prozessnamen überprüfen:
quelle
devenv
.Komponente ... hat meines Wissens nicht die DesignMode-Eigenschaft. Diese Eigenschaft wird von Control bereitgestellt. Das Problem ist jedoch, dass CustomControl im Laufzeitmodus ausgeführt wird, wenn sich CustomControl in einem Formular im Designer befindet.
Ich habe festgestellt, dass die DesignMode-Eigenschaft nur in Form korrekt funktioniert.
quelle
Steuerelemente (Formulare, Benutzersteuerungen usw.) erben,
Component class
die Folgendes habenbool property DesignMode
:quelle
OnHandleCreated
.WICHTIG
Es gibt einen Unterschied bei der Verwendung von Windows Forms oder WPF !!
Sie haben unterschiedliche Designer und benötigen unterschiedliche Prüfungen . Außerdem ist es schwierig, Formulare und WPF-Steuerelemente zu mischen. (zB WPF-Steuerelemente in einem Formularfenster)
Wenn Sie nur Windows Forms haben , verwenden Sie Folgendes:
Wenn Sie nur WPF haben , verwenden Sie diese Prüfung:
Wenn Sie Forms und WPF gemischt verwenden , verwenden Sie eine Prüfung wie folgt:
Um den aktuellen Modus anzuzeigen, können Sie eine MessageBox zum Debuggen anzeigen:
Anmerkung:
Sie müssen die Namespaces System.ComponentModel und System.Diagnostics hinzufügen .
quelle
Sie sollten die Component.DesignMode-Eigenschaft verwenden. Soweit ich weiß, sollte dies nicht von einem Konstruktor verwendet werden.
quelle
if (!DesignMode)
OnPaint-Methoden hinzufügen , um sicherzustellen, dass die Entwurfszeit nicht durch Spam beeinträchtigt wird.Eine weitere interessante Methode wird in diesem Blog beschrieben: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -Benutzermodus/
Grundsätzlich wird geprüft, ob die ausführende Assembly statisch von der Eintragsassembly referenziert wird. Es umgeht die Notwendigkeit, Baugruppennamen zu verfolgen ('devenv.exe', 'monodevelop.exe' ..).
Es funktioniert jedoch nicht in allen anderen Szenarien, in denen die Assembly dynamisch geladen wird (VSTO ist ein Beispiel).
quelle
In Zusammenarbeit mit dem Designer ... Kann in Steuerelementen, Komponenten, an allen Orten verwendet werden
MessageBox.Show(
Linien sollten entfernt werden. Es macht mich nur sicher, dass es richtig funktioniert.quelle
Sie können dies verwenden
quelle
Dies ist die Methode, die ich in meinem Projekt verwendet habe:
Achtung !!!: Der zurückgegebene Code bool zeigt NICHT im Designmodus an!
quelle
quelle
Die LicenseManager-Lösung funktioniert weder in OnPaint noch in this.DesignMode. Ich habe auf die gleiche Lösung wie @Jarek zurückgegriffen.
Hier ist die zwischengespeicherte Version:
Beachten Sie, dass dies fehlschlägt, wenn Sie eine IDE eines Drittanbieters verwenden oder wenn Microsoft (oder Ihr Endbenutzer) beschließt, den Namen der ausführbaren VS-Datei in einen anderen Namen als "devenv" zu ändern. Die Fehlerrate ist sehr niedrig. Stellen Sie nur sicher, dass Sie sich mit allen resultierenden Fehlern befassen, die im Code auftreten können, der als Folge davon fehlschlägt, und es wird Ihnen gut gehen.
quelle
Wenn Sie einige Zeilen ausführen möchten, während sie ausgeführt werden, jedoch nicht im Visual Studio-Designer, sollten Sie die DesignMode-Eigenschaft wie folgt implementieren:
quelle
Standardmäßig aktivierte Timer können bei Verwendung von benutzerdefinierten Steuerelementen / Benutzersteuerelementen zum Absturz führen. Deaktivieren Sie sie standardmäßig und aktivieren Sie sie erst nach Überprüfung des Entwurfsmodus
quelle