Adakah yang tahu tentang beberapa variabel kondisi global yang tersedia sehingga saya dapat memeriksa apakah kode tersebut sedang dijalankan dalam mode desain (misalnya dalam Blend atau Visual Studio) atau tidak?
Akan terlihat seperti ini:
//pseudo code:
if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode)
{
...
}
Alasan saya membutuhkan ini adalah: ketika aplikasi saya ditampilkan dalam mode desain di Expression Blend, saya ingin ViewModel sebagai gantinya menggunakan "kelas Pelanggan Desain" yang memiliki data tiruan di dalamnya yang dapat dilihat oleh perancang dalam mode desain.
Namun, ketika aplikasi benar-benar dieksekusi, saya tentu saja menginginkan ViewModel untuk menggunakan kelas Pelanggan nyata yang mengembalikan data nyata.
Saat ini saya memecahkan masalah ini dengan meminta desainernya, sebelum ia mengerjakannya, masuk ke ViewModel dan ubah "ApplicationDevelopmentMode.Executing" menjadi "ApplicationDevelopmentMode.Designing":
public CustomersViewModel()
{
_currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing;
}
public ObservableCollection<Customer> GetAll
{
get
{
try
{
if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing)
{
return Customer.GetAll;
}
else
{
return CustomerDesign.GetAll;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
sumber
Enable project code
harus diaktifkan (atau Menu-> Desain-> 🗹 Jalankan Kode Proyek).Anda dapat melakukan sesuatu seperti ini:
sumber
internal class MyDependencyObject : DependencyObject {}
dan gunakannew MyDependencyObject
alih-alihDependencyObject
DependencyObject
konstruktornya adalahpublic
.Bekerja dari mana saja. Saya menggunakannya untuk menghentikan video databound dari bermain di perancang.
sumber
Application.Current.MainWindow == null
meskipun saya suka jenis tes yang lebih baik, lebih langsung. Itu juga tampak seolah-olah desainer yang di-host di Visual Studio menambahkan sumber daya, jadi inilah cara lain untuk melakukannya (jika Anda tidak memiliki akses keApp
tipe spesifik di perpustakaan yang menampung kode Anda)((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])
. Perlu memeriksa jika sumber daya tidak ada di sana tetapi itu berfungsi dalam konteks desainer.Ketika Visual Studio otomatis menghasilkan beberapa kode untuk saya, itu digunakan
sumber
Ada cara lain (mungkin yang lebih baru) untuk menentukan data waktu desain di WPF, seperti yang disebutkan dalam jawaban terkait ini .
Pada dasarnya, Anda dapat menentukan data waktu desain menggunakan instance waktu desain ViewModel Anda :
atau dengan menentukan data sampel dalam file XAML :
Anda harus mengatur
SamplePage.xaml
properti file ke:Saya menempatkan ini di
UserControl
tag saya , seperti ini:Saat run-time, semua tag desain-waktu "d:" menghilang, jadi Anda hanya akan mendapatkan konteks data run-time Anda, namun Anda memilih untuk mengaturnya.
Sunting Anda mungkin juga perlu baris-baris ini (saya tidak yakin, tetapi tampaknya relevan):
sumber
Dan jika Anda secara ekstensif menggunakan Caliburn.Micro untuk aplikasi WPF / Silverlight / WP8 / WinRT besar Anda, Anda dapat menggunakan properti statis caliburn yang praktis dan universal
Execute.InDesignMode
dalam model tampilan Anda juga (dan berfungsi di Blend dan Visual Studio):sumber
Saya hanya menguji ini dengan Visual Studio 2013 dan .NET 4.5 tetapi itu berhasil.
Meskipun beberapa pengaturan dalam Visual Studio akan mengubah nilai ini menjadi false, jika itu terjadi, kami dapat memeriksa apakah nama sumber daya ini ada. Itu
null
ketika saya menjalankan kode saya di luar perancang.Kelebihan dari pendekatan ini adalah bahwa ia tidak memerlukan pengetahuan eksplisit tentang
App
kelas tertentu dan dapat digunakan secara global di seluruh kode Anda. Khusus untuk mengisi model tampilan dengan data dummy.sumber
Jawaban yang diterima tidak berhasil untuk saya (VS2019).
Setelah memeriksa apa yang sedang terjadi, saya datang dengan ini:
sumber
#if DEBUG
lain mengembalikan false. Apakah ada alasan untuk tidak melakukan itu?Saya punya ide untuk Anda jika kelas Anda tidak memerlukan konstruktor kosong.
Idenya adalah membuat konstruktor kosong, lalu menandainya dengan ObsoleteAttribute. Perancang mengabaikan atribut usang, tetapi kompiler akan memunculkan kesalahan jika Anda mencoba menggunakannya, jadi tidak ada risiko tidak sengaja menggunakannya sendiri.
( Maafkan visual basic saya )
Dan xaml:
Ini tidak akan berfungsi jika Anda benar - benar membutuhkan konstruktor kosong untuk sesuatu yang lain.
sumber