Existe-t-il une propriété DesignMode dans WPF?

101

Dans Winforms, vous pouvez dire

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

y a-t-il quelque chose comme ça dans WPF?

Russ
la source
2
Notez que GetIsInDesignMode souffre d' un même bug énorme que la propriété DesignMode
BlueRaja - Danny Pflughoeft

Réponses:

152

En effet, il y a :

System.ComponentModel.DesignerProperties.GetIsInDesignMode

Exemple:

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
la source
J'ai appliqué votre solution dans mon application mais cela ne fonctionne pas. Je l'ai demandé ici stackoverflow.com/questions/3987439/… . Si vous le souhaitez, rejoignez-nous et discutez-en.
Nam G VU
@serhio Merci d'avoir signalé cela. Connaissez-vous une solution de contournement? Btw, il semble que cela ne fonctionne pas non plus dans Silverlight: connect.microsoft.com/VisualStudio/feedback/details/371837
Enrico Campidoglio
Dans VS2019, le commutateur Enable project codedoit être activé (ou Menu-> Design-> 🗹 Run Project Code).
marbel82
47

Dans certains cas, j'ai besoin de savoir si un appel à ma classe non-UI est lancé par le concepteur (comme si je crée une classe DataContext à partir de XAML). Ensuite, l'approche de cet article MSDN est utile:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{
    //in Design mode
}
Max Galkin
la source
J'ai appliqué votre solution dans mon application mais cela ne fonctionne pas. Je l'ai demandé ici stackoverflow.com/questions/3987439/… . Si vous le souhaitez, rejoignez-nous et discutez-en.
Nam G VU
20

Pour tous les contrôles WPF hébergés dans WinForms , DesignerProperties.GetIsInDesignMode(this)ne fonctionne pas.

J'ai donc créé un bogue dans Microsoft Connect et ajouté une solution de contournement:

public static bool IsInDesignMode()
{
    if ( System.Reflection.Assembly.GetExecutingAssembly().Location.Contains( "VisualStudio" ) )
    {
        return true;
    }
    return false;
}
serhio
la source
Ne devrait-il pas être à la GetEntryAssembly()place de GetExecutingAssembly()? Ce dernier devrait renvoyer l'assemblage où cette propriété est définie
fjch1997
7

Réponse tardive, je sais - mais pour tous ceux qui souhaitent utiliser ceci dans un DataTrigger, ou n'importe où dans XAML en général:

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
la source
0

Utilisez celui-ci:

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

(Les opérations Async et File ne fonctionneront pas ici)

En outre, pour instancier un objet au moment du design en XAML (d est l'espace de noms du concepteur spécial)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}">
...
</Grid>
Jeson Martajaya
la source
Cette classe ( Windows.ApplicationModel) est destinée aux applications Store, incluses dans l'API Windows Runtime. Ce n'est pas une solution WPF prête à l'emploi si vous travaillez uniquement sur une application de bureau Windows standard.
qJake