Setelah pertanyaan ini , apakah mungkin untuk mendeteksi apakah seseorang dalam mode desain atau runtime dari dalam konstruktor objek?
Saya menyadari bahwa ini mungkin tidak dapat dilakukan, dan saya harus mengubah apa yang saya inginkan, tetapi untuk saat ini saya tertarik dengan pertanyaan khusus ini.
ISite.DesignMode
.Apakah Anda mencari sesuatu seperti ini:
Anda juga dapat melakukannya dengan memeriksa nama proses:
sumber
devenv
.Komponen ... sejauh yang saya tahu tidak memiliki properti DesignMode. Properti ini disediakan oleh Control. Namun masalahnya adalah ketika CustomControl terletak di Formulir di desainer, CustomControl ini berjalan dalam mode runtime.
Saya telah mengalami bahwa properti DesignMode hanya berfungsi dengan benar dalam Formulir.
sumber
Kontrol (Formulir, UserControls, dll.) Mewarisi
Component class
yang memilikibool property DesignMode
:sumber
OnHandleCreated
.PENTING
Ada perbedaan dalam menggunakan Formulir Windows atau WPF !!
Mereka memiliki desainer yang berbeda dan membutuhkan pemeriksaan yang berbeda . Selain itu, sulit saat Anda mencampur formulir dan kontrol WPF. (misalnya kontrol WPF di dalam jendela Formulir)
Jika Anda hanya memiliki Formulir Windows , gunakan ini:
Jika Anda hanya memiliki WPF , gunakan pemeriksaan ini:
Jika Anda memiliki penggunaan campuran Formulir dan WPF, gunakan tanda centang seperti ini:
Untuk melihat mode saat ini, Anda dapat menampilkan MessageBox untuk debugging:
Ucapan:
Anda perlu menambahkan ruang nama System.ComponentModel dan System.Diagnostics .
sumber
Anda harus menggunakan properti Component.DesignMode. Sejauh yang saya tahu, ini tidak boleh digunakan dari konstruktor.
sumber
if (!DesignMode)
metode OnPaint untuk memastikannya tidak mengirim spam waktu desain.Metode lain yang menarik dijelaskan di blog itu: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -mode pengguna/
Pada dasarnya, ini menguji rakitan pelaksana yang direferensikan secara statis dari rakitan entri. Ini menghindari kebutuhan untuk melacak nama assembly ('devenv.exe', 'monodevelop.exe' ..).
Namun, itu tidak bekerja di semua skenario lain, di mana rakitan dimuat secara dinamis (VSTO menjadi salah satu contoh).
sumber
Dengan kerja sama perancang ... Dapat digunakan di Kontrol, Komponen, di semua tempat
MessageBox.Show(
garis harus dihapus. Itu hanya membuat saya yakin itu berfungsi dengan benar.sumber
Anda bisa menggunakan ini
sumber
Ini adalah metode yang saya gunakan dalam proyek saya:
Perhatian !!!: Kode yang dikembalikan bool menunjukkan TIDAK dalam mode desain!
sumber
sumber
Solusi LicenseManager tidak berfungsi di dalam OnPaint, begitu pula this.DesignMode. Saya menggunakan solusi yang sama dengan @Jarek.
Berikut versi cache:
Ketahuilah bahwa ini akan gagal jika Anda menggunakan IDE pihak ketiga atau jika Microsoft (atau pengguna akhir Anda) memutuskan untuk mengubah nama VS yang dapat dieksekusi menjadi sesuatu selain 'devenv'. Tingkat kegagalan akan sangat rendah, cukup pastikan Anda menangani kesalahan yang dihasilkan yang mungkin terjadi dalam kode yang gagal sebagai akibatnya dan Anda akan baik-baik saja.
sumber
Jika Anda ingin menjalankan beberapa baris saat sedang berjalan tetapi tidak di desainer Visual Studio, Anda harus menerapkan properti DesignMode sebagai berikut:
sumber
Pengatur waktu yang diaktifkan secara default dapat menyebabkan kerusakan saat menggunakan kontrol kustom / pengguna. Nonaktifkan mereka secara default, dan aktifkan hanya setelah pemeriksaan mode desain
sumber