Kontynuując to pytanie , czy możliwe jest wykrycie, czy jest się w trybie projektowania lub wykonywania z poziomu konstruktora obiektu?
Zdaję sobie sprawę, że może to nie być możliwe i że będę musiał zmienić to, co chcę, ale na razie interesuje mnie to konkretne pytanie.
ISite.DesignMode
.Szukasz czegoś takiego:
Możesz to również zrobić, sprawdzając nazwę procesu:
źródło
devenv
.Komponent ... o ile wiem, nie ma właściwości DesignMode. Ta właściwość jest udostępniana przez Control. Ale problem polega na tym, że CustomControl znajduje się w formularzu w projektancie, to CustomControl działa w trybie środowiska uruchomieniowego.
Doświadczyłem, że właściwość DesignMode działa poprawnie tylko w Form.
źródło
Kontrolki (formularze, kontrolki użytkownika itp.) Dziedziczą,
Component class
co mabool property DesignMode
:źródło
OnHandleCreated
.WAŻNY
Istnieje różnica w używaniu Windows Forms lub WPF !!
Mają różnych projektantów i wymagają różnych kontroli . Ponadto jest to trudne w przypadku mieszania formantów Forms i WPF. (np. kontrolki WPF w oknie formularzy)
Jeśli masz tylko Windows Forms , użyj tego:
Jeśli masz tylko WPF , użyj tego sprawdzenia:
Jeśli masz mieszane użycie formularzy i WPF, użyj takiego sprawdzenia:
Aby zobaczyć bieżący tryb, możesz wyświetlić MessageBox do debugowania:
Uwaga:
Musisz dodać przestrzenie nazw System.ComponentModel i System.Diagnostics .
źródło
Należy użyć właściwości Component.DesignMode. O ile wiem, nie powinno to być używane przez konstruktora.
źródło
if (!DesignMode)
metody OnPaint, aby upewnić się, że nie spamuje czasu projektowania.Inna ciekawa metoda jest opisana na tym blogu: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -tryb użytkownika/
Zasadniczo sprawdza, czy zestaw wykonawczy jest statycznie przywoływany z zestawu wejścia. Zapobiega to konieczności śledzenia nazw zestawów („devenv.exe”, „monodevelop.exe”…).
Jednak nie działa we wszystkich innych scenariuszach, w których zestaw jest ładowany dynamicznie (jednym z przykładów jest VSTO).
źródło
Przy współpracy projektanta ... Może być stosowany w Sterownikach, Komponenty, w każdym miejscu
MessageBox.Show(
linie powinny zostać usunięte. To tylko upewnia mnie, że działa poprawnie.źródło
Możesz tego użyć
źródło
Oto metoda, którą zastosowałem w swoim projekcie:
Uwaga !!!: Zwrócony kod bool oznacza NIE w trybie projektowania!
źródło
źródło
Rozwiązanie LicenseManager nie działa wewnątrz OnPaint, podobnie jak this.DesignMode. Sięgnąłem po to samo rozwiązanie co @Jarek.
Oto wersja z pamięci podręcznej:
Należy pamiętać, że to się nie powiedzie, jeśli używasz środowiska IDE innej firmy lub jeśli Microsoft (lub Twój użytkownik końcowy) zdecyduje się zmienić nazwę pliku wykonywalnego VS na inną niż „devenv”. Wskaźnik awaryjności będzie bardzo niski, po prostu upewnij się, że poradzisz sobie z wynikającymi z tego błędami, które mogą wystąpić w kodzie, który z tego powodu zawodzi, a wszystko będzie dobrze.
źródło
Jeśli chcesz uruchomić niektóre wiersze, gdy jest uruchomiony, ale nie w projektancie programu Visual Studio, należy zaimplementować właściwość DesignMode w następujący sposób:
źródło
Timery, które są domyślnie włączone, mogą powodować awarie podczas korzystania z elementów sterujących niestandardowych / użytkownika. Wyłącz je domyślnie i włącz dopiero po sprawdzeniu trybu projektowania
źródło