Existe uma propriedade DesignMode no WPF?


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
        }
    }
}

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
}

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;
}

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>

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>

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.