Existe-t-il un moyen de vérifier si WPF s’exécute actuellement en mode conception ou non?

Est-ce que quelqu’un connaît une variable d’état globale disponible pour que je puisse vérifier si le code s’exécute actuellement en mode conception (par exemple dans Blend ou Visual Studio) ou non?

Cela ressemblerait à ceci:

//pseudo code: if (Application.Current.ExecutingStatus == ExecutingStatus.DesignMode) { ... } 

La raison pour laquelle j’en ai besoin est la suivante: lorsque mon application est affichée en mode conception dans Expression Blend, je souhaite que ViewModel utilise plutôt une “classe Design Client” contenant des données fictives que le concepteur peut afficher en mode Création.

Cependant, lorsque l’application est en cours d’exécution, je souhaite bien sûr que ViewModel utilise la vraie classe Customer qui renvoie des données réelles.

Actuellement, je résous ce problème en faisant en sorte que le concepteur, avant de travailler dessus, entre dans le ViewModel et remplace “ApplicationDevelopmentMode.Executing” par “ApplicationDevelopmentMode.Designing”:

 public CustomersViewModel() { _currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing; } public ObservableCollection GetAll { get { try { if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing) { return Customer.GetAll; } else { return CustomerDesign.GetAll; } } catch (Exception ex) { throw new Exception(ex.Message); } } } 

Je pense que vous recherchez GetIsInDesignMode , qui prend un DependencyObject.

C’est à dire.

 // 'this' is your UI element DesignerProperties.GetIsInDesignMode(this); 

Edit: Lors de l’utilisation de Silverlight / WP7, vous devez utiliser IsInDesignTool car GetIsInDesignMode peut parfois retourner la valeur false dans Visual Studio:

 DesignerProperties.IsInDesignTool 

Edit: Et finalement, pour être complet, l’équivalent dans les applications WinRT / Metro / Windows Store est DesignModeEnabled :

 Windows.ApplicationModel.DesignMode.DesignModeEnabled 

Vous pouvez faire quelque chose comme ça:

 DesignerProperties.GetIsInDesignMode(new DependencyObject()); 
 public static bool InDesignMode() { return !(Application.Current is App); } 

Fonctionne de n’importe où. Je l’utilise pour empêcher les vidéos de la firebase database de jouer dans le concepteur.

Lorsque Visual Studio a généré automatiquement du code pour moi, il a utilisé

 if (!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) { ... } 

Et si vous utilisez intensivement Caliburn.Micro pour votre grande application WPF / Silverlight / WP8 / WinRT , vous pouvez également utiliser la propriété statique Execute.InDesignMode de Execute.InDesignMode maniable et universel dans vos modèles de vue (et cela fonctionne aussi bien que dans Visual Studio ):

 using Caliburn.Micro; // ... ///  /// Default view-model's ctor without parameters. ///  public SomeViewModel() { if(Execute.InDesignMode) { //Add fake data for design-time only here: //SomeSsortingngItems = new List //{ // "Item 1", // "Item 2", // "Item 3" //}; } } 

Il existe d’autres moyens (peut-être plus récents) de spécifier des données au moment de la conception dans WPF, comme indiqué dans cette réponse associée .

Essentiellement, vous pouvez spécifier des données au moment du design à l’aide d’une instance de conception de votre ViewModel :

 d:DataContext="{d:DesignInstance Type=v:MySampleData, IsDesignTimeCreatable=True}" 

ou en spécifiant des exemples de données dans un fichier XAML :

 d:DataContext="{d:DesignData Source=../DesignData/SamplePage.xaml}"> 

Vous devez définir les propriétés du fichier SamplePage.xaml sur:

 BuildAction: DesignData Copy to Output Directory: Do not copy Custom Tool: [DELETE ANYTHING HERE SO THE FIELD IS EMPTY] 

Je les place dans mon tag UserControl , comme ceci:

  

Au moment de l’exécution, tous les tags au moment de la conception “d:” disparaissent, de sorte que vous n’obtiendrez que votre contexte de données d’exécution, quel que soit votre choix.

Modifier Vous pouvez également avoir besoin de ces lignes (je ne suis pas certain, mais elles semblent pertinentes):

 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" 

Je l’ai seulement testé avec Visual Studio 2013 et .NET 4.5 mais il fait l’affaire.

 public static bool IsDesignerContext() { var maybeExpressionUseLayoutRounding = Application.Current.Resources["ExpressionUseLayoutRounding"] as bool?; return maybeExpressionUseLayoutRounding ?? false; } 

Il est possible que certains parameters de Visual Studio transforment cette valeur en false, si cela se produit, nous pouvons simplement vérifier si ce nom de ressource existe. C’était null quand j’ai exécuté mon code en dehors du concepteur.

L’avantage de cette approche est qu’elle n’exige pas une connaissance explicite de la classe spécifique de l’ App et qu’elle peut être utilisée globalement dans tout votre code. Spécifiquement pour remplir les modèles de vue avec des données factices.

J’ai une idée pour vous si votre classe n’a pas besoin d’un constructeur vide.

L’idée est de créer un constructeur vide, puis de le marquer avec ObsoleteAtsortingbute. Le concepteur ignore l’atsortingbut obsolète, mais le compilateur générera une erreur si vous essayez de l’utiliser, il n’y a donc aucun risque de l’utiliser accidentellement vous-même.

( pardonne mon visuel de base )

 Public Class SomeClass  Public Sub New() DesignMode = True If DesignMode Then Name = "Paula is Brillant" End If End Sub Public Property DesignMode As Boolean Public Property Name As Ssortingng = "FileNotFound" End Class 

Et le xaml:

          

résultat du code ci-dessus

Cela ne fonctionnera pas si vous avez vraiment besoin du constructeur vide pour autre chose.