2009-01-08 5 views
92

En Winforms vous pouvez direY a-t-il une propriété DesignMode dans WPF?

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

est là quelque chose comme ça dans WPF?

+1

Notez que GetIsInDesignMode souffre de [le même bug énorme que la propriété DesignMode ] (http://stackoverflow.com/questions/34664/designmode-with-controls) –

Répondre

139

En effet, il est:

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

J'ai appliqué votre solution dans mon application mais cela ne fonctionne pas. Je l'ai demandé ici http://stackoverflow.com/questions/3987439/init-grid-row-height-doesnt-work. Si vous le souhaitez, rejoignez-nous et discutez-en. –

+3

ce code ne fonctionne pas si le WPF est hébergé sur un WinForm. – serhio

+0

@serhio Merci d'avoir signalé cela. Connaissez-vous une solution de contournement? Btw il semble que cela ne fonctionne pas non plus dans Silverlight: http://connect.microsoft.com/VisualStudio/feedback/details/371837/designerproperties-getisindesignmode-doesnt-work-with-silverlight-pages –

45

Dans certains cas, je dois savoir, si un appel à ma classe non-UI est initiée par le concepteur (comme si je créais une classe DataContext à partir de XAML). Ensuite, l'approche from this MSDN article est utile:

// Check for design mode. 
if ((bool)(DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)) 
{ 
    //in Design mode 
} 
+0

J'ai appliqué votre solution dans mon application mais cela ne fonctionne pas. Je l'ai demandé ici http://stackoverflow.com/questions/3987439/init-grid-row-height-doesnt-work. Si vous le souhaitez, rejoignez-nous et discutez-en. –

19

Pour toute WPF Controls hébergés dans WinForms, DesignerProperties.GetIsInDesignMode(this) ne fonctionne pas.

Alors, j'ai créé a bug in Microsoft Connect et a ajouté une solution de contournement:

public static bool IsInDesignMode() 
{ 
    if (System.Reflection.Assembly.GetExecutingAssembly().Location.Contains("VisualStudio")) 
    { 
     return true; 
    } 
    return false; 
} 
+0

Cela ne devrait-il pas être 'GetEntryAssembly()' au lieu de 'GetExecutingAssembly()'? Ce dernier doit renvoyer l'assembly dans lequel cette propriété est définie – fjch1997

-1

Utilisez celui-ci:

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

(Async et opérations fichiers ne fonctionnera pas ici)

En outre, pour instancier un Objet au moment du design dans XAML (d est l'espace de nom du concepteur spécial)

<Grid d:DataContext="{d:DesignInstance Type=local:MyViewModel, IsDesignTimeCreatable=True}"> 
... 
</Grid> 
+0

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 sur une application de bureau Windows standard. – qJake

3

réponse tardive, je sais - mais pour quelqu'un d'autre qui veut l'utiliser dans un DataTrigger ou partout 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> 
Questions connexes