Existe uma propriedade DesignMode no WPF?

101

No Winforms você pode dizer

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

existe algo assim no WPF?

Russ
fonte
2
Observe que GetIsInDesignMode sofre do mesmo bug enorme que a propriedade DesignMode
BlueRaja - Danny Pflughoeft

Respostas:

152

Na verdade, existe :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Exemplo:

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
fonte
Eu apliquei sua solução em meu aplicativo, mas não funciona. Eu perguntei aqui stackoverflow.com/questions/3987439/… . Se você quiser, junte-se a nós e discuta.
Nam G VU
@serhio Obrigado por apontar isso. Você está ciente de alguma solução alternativa? A propósito, parece que também não funciona no Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837/…
Enrico Campidoglio
No VS2019, a chave Enable project codedeve estar habilitada (ou Menu-> Design-> 🗹 Executar Código do Projeto).
marbel82
47

Em alguns casos, preciso saber se uma chamada para minha classe não IU é iniciada pelo designer (como se eu criasse uma classe DataContext a partir de XAML). Então, a abordagem deste artigo do MSDN é útil:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Max Galkin
fonte
Eu apliquei sua solução em meu aplicativo, mas não funciona. Eu perguntei aqui stackoverflow.com/questions/3987439/… . Se você quiser, junte-se a nós e discuta.
Nam G VU
20

Para quaisquer controles WPF hospedados em WinForms ,DesignerProperties.GetIsInDesignMode(this) não funciona.

Portanto, criei um bug no Microsoft Connect e adicionei uma solução alternativa:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
serio
fonte
Não deveria ser em GetEntryAssembly()vez de GetExecutingAssembly()? Este último deve retornar a montagem onde esta propriedade está definida
fjch1997
7

Resposta tardia, eu sei - mas para qualquer pessoa que queira usar isso em um DataTriggerou em qualquer lugar do XAML em geral:

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
fonte
0

Use este:

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

(As operações Async e File não funcionam aqui)

Além disso, para instanciar um objeto de tempo de design em XAML (d é o namespace de designer especial)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Jeson Martajaya
fonte
Essa classe ( Windows.ApplicationModel) é para aplicativos da Store, incluídos na API do Windows Runtime. Esta não é uma solução WPF out-of-the-box se você estiver apenas trabalhando em um aplicativo de desktop normal do Windows.
qJake