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:
Cela ne fonctionnera pas si vous avez vraiment besoin du constructeur vide pour autre chose.