Quelqu'un connaît-il une variable d'état globale disponible pour que je puisse vérifier si le code est actuellement en cours d'exécution en mode conception (par exemple dans Blend ou Visual Studio) ou non?
Cela ressemblerait à quelque chose comme 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 le ViewModel utilise à la place une "classe Design Customer" qui contient des données simulées que le concepteur peut afficher en mode conception.
Cependant, lorsque l'application s'exécute réellement, je souhaite bien sûr que le ViewModel utilise la classe Customer réelle qui renvoie des données réelles.
Actuellement, je résous ce problème en demandant au concepteur, avant de travailler dessus, d'aller dans le ViewModel et de changer "ApplicationDevelopmentMode.Executing" en "ApplicationDevelopmentMode.Designing":
public CustomersViewModel()
{
_currentApplicationDevelopmentMode = ApplicationDevelopmentMode.Designing;
}
public ObservableCollection<Customer> GetAll
{
get
{
try
{
if (_currentApplicationDevelopmentMode == ApplicationDevelopmentMode.Developing)
{
return Customer.GetAll;
}
else
{
return CustomerDesign.GetAll;
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
la source
Enable project code
doit être activé (ou Menu-> Conception-> 🗹 Exécuter le code de projet).Vous pouvez faire quelque chose comme ceci:
la source
internal class MyDependencyObject : DependencyObject {}
et utiliser à lanew MyDependencyObject
place deDependencyObject
DependencyObject
estpublic
.Fonctionne de n'importe où. Je l'utilise pour empêcher la lecture de vidéos basées sur des données dans le concepteur.
la source
Application.Current.MainWindow == null
bien que j'aime mieux le test de type, plus direct. Il semble également que le concepteur hébergé dans Visual Studio ajoute des ressources, voici donc une autre façon de le faire (si vous n'avez pas accès auApp
type spécifique dans la bibliothèque hébergeant votre code)((bool)Application.Current.Resources["ExpressionUseLayoutRounding"])
. Besoin de vérifier si la ressource n'est pas là, mais cela fonctionne dans le contexte du concepteur.Lorsque Visual Studio a généré automatiquement du code pour moi, il a utilisé
la source
Il existe d'autres moyens (peut-être plus récents) de spécifier des données au moment du design dans WPF, comme mentionné dans cette réponse connexe .
Essentiellement, vous pouvez spécifier des données au moment du design à l'aide d'une instance au moment du design de votre ViewModel :
ou en spécifiant des exemples de données dans un fichier XAML :
Vous devez définir les
SamplePage.xaml
propriétés du fichier sur:Je les place dans mon
UserControl
tag, comme ceci:Au moment de l'exécution, toutes les balises de conception "d:" disparaissent, vous n'obtiendrez donc que votre contexte de données d'exécution, quelle que soit la manière dont vous le définissez.
Edit Vous pouvez également avoir besoin de ces lignes (je ne suis pas certain, mais elles semblent pertinentes):
la source
Et si vous utilisez intensivement Caliburn.Micro pour votre grande application WPF / Silverlight / WP8 / WinRT , vous pouvez également utiliser la propriété statique de caliburn pratique et universelle
Execute.InDesignMode
dans vos modèles de vue (et cela fonctionne aussi bien dans Blend que dans Visual Studio):la source
Je n'ai testé cela qu'avec Visual Studio 2013 et .NET 4.5, mais cela fait l'affaire.
Il est possible que certains paramètres de Visual Studio modifient 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 ne nécessite pas de connaissance explicite de la
App
classe spécifique 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.la source
La réponse acceptée n'a pas fonctionné pour moi (VS2019).
Après avoir inspecté ce qui se passait, j'ai trouvé ceci:
la source
#if DEBUG
autre return false. Y a-t-il une raison de ne pas faire cela?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 ObsoleteAttribute. Le concepteur ignore l'attribut obsolète, mais le compilateur lèvera une erreur si vous essayez de l'utiliser, il n'y a donc aucun risque de l'utiliser accidentellement vous-même.
( pardonnez mon visuel basique )
Et le xaml:
Cela ne fonctionnera pas si vous avez vraiment besoin du constructeur vide pour autre chose.
la source