Apakah ada properti DesignMode di WPF?

101

Di Winforms Anda bisa mengatakan

if ( DesignMode )
{
  // Do something that only happens on Design mode
}

apakah ada yang seperti ini di WPF?

Russ
sumber
2
Perhatikan bahwa GetIsInDesignMode menderita bug besar yang sama seperti properti DesignMode
BlueRaja - Danny Pflughoeft

Jawaban:

152

Memang ada :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Contoh:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

public class MyUserControl : UserControl
{
    public MyUserControl()
    {
        if (DesignerProperties.GetIsInDesignMode(this))
        {
            // Design-mode specific functionality
        }
    }
}
Enrico Campidoglio
sumber
Saya menerapkan solusi Anda dalam aplikasi saya tetapi tidak berhasil. Saya menanyakannya di sini stackoverflow.com/questions/3987439/… . Jika Anda mau, silakan bergabung dengan kami dan berdiskusi.
Nam G VU
@serhio Terima kasih telah menunjukkan hal itu. Apakah Anda mengetahui adanya solusi? Btw tampaknya itu juga tidak berfungsi di Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio
Dalam VS2019, sakelar Enable project codeharus diaktifkan (atau Menu-> Desain-> 🗹 Jalankan Kode Proyek).
marbel82
47

Dalam beberapa kasus saya perlu tahu, apakah panggilan ke kelas non-UI saya diprakarsai oleh perancang (seperti jika saya membuat kelas DataContext dari XAML). Maka pendekatan dari artikel MSDN ini sangat membantu:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Max Galkin
sumber
Saya menerapkan solusi Anda dalam aplikasi saya tetapi tidak berhasil. Saya menanyakannya di sini stackoverflow.com/questions/3987439/… . Jika Anda mau, silakan bergabung dengan kami dan berdiskusi.
Nam G VU
20

Untuk Kontrol WPF apa pun yang dihosting di WinForms , DesignerProperties.GetIsInDesignMode(this)tidak berfungsi.

Jadi, saya membuat bug di Microsoft Connect dan menambahkan solusi:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
serhio
sumber
Bukankah seharusnya GetEntryAssembly()bukan GetExecutingAssembly()? Yang terakhir harus mengembalikan perakitan di mana properti ini ditentukan
fjch1997
7

Jawaban terlambat, saya tahu - tetapi untuk siapa pun yang ingin menggunakan ini di DataTrigger, atau di mana pun di XAML secara umum:

xmlns:componentModel="clr-namespace:System.ComponentModel;assembly=PresentationFramework"

<Style.Triggers>
    <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, 
                 Path=(componentModel:DesignerProperties.IsInDesignMode)}" 
                 Value="True">
        <Setter Property="Visibility" Value="Visible"/>
    </DataTrigger>
</Style.Triggers>
Manfred Radlwimmer
sumber
0

Gunakan yang ini:

if (Windows.ApplicationModel.DesignMode.DesignModeEnabled)
{
    //design only code here
}

(Operasi Async dan File tidak akan berfungsi di sini)

Juga, untuk membuat contoh objek waktu desain di XAML (d adalah namespace desainer khusus)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Jeson Martajaya
sumber
Kelas itu ( Windows.ApplicationModel) adalah untuk aplikasi Store, termasuk dalam Windows Runtime API. Ini bukan solusi WPF out-of-the-box jika Anda hanya bekerja pada aplikasi desktop Windows biasa.
qJake