/ / Visual Studio ne peut pas résoudre la ressource statique dans la fenêtre WPF, même si cela fonctionne au moment de l'exécution - pourquoi? - wpf, visual-studio, ressources, viewmodel

Visual Studio ne peut pas résoudre les ressources statiques dans la fenêtre WPF, même s'il fonctionne au moment de l'exécution - pourquoi? - wpf, visual-studio, ressources, viewmodel

J'ai une fenêtre WPF et j'utilise le modèle MVVM. J'ai défini le modèle de vue comme une ressource pour la fenêtre comme suit ...

<Window
...other stuff removed for clarity...
xmlns:mvvm="clr-namespace:VisionRT.CRM.WPF.ViewModels.VRTSystems"
>
<Window.Resources>
<mvvm:DhrTemplatesViewModel x:Key="viewmodel" />
</Window.Resources>

Je veux définir le contexte de données de la fenêtre pour utiliser la ressource, et j'ai trouvé que le XAML suivant fonctionne ...

  <Window.DataContext>
<StaticResource ResourceKey="viewmodel"/>
<Window.DataContext>

Le problème est que je ne peux le faire qu'en tapantle XAML manuellement, Visual Studio n'affiche la ressource nulle part. Je peux aller dans les propriétés de la fenêtre et cliquer sur la petite icône à côté de la propriété DataContext, cliquer sur l'option «Appliquer la ressource», mais elle n'affiche pas le modèle de vue "en tant que ressource, statique ou dynamique. Si j'entre manuellement le code XAML et que j'ouvre la fenêtre contextuelle" Appliquer la ressource ", le" modèle de vue "est souligné comme une erreur et le survol affiche une info-bulle" Impossible de résoudre la ressource référence"

Cependant, lorsque je lance l'application, cela fonctionne bien, donc la ressource est en cours de résolution au moment de l'exécution.

Quelqu'un peut-il expliquer cela? J'aimerais vraiment pouvoir le faire via l'éditeur de propriétés VS, car je trouve cela plus pratique que de taper le XAMl à la main. Je suis également gêné par le fait que VS ne peut pas le résoudre. Cela me fait penser que je fais quelque chose de mal.

Merci pour toute explication que vous pouvez donner.

Réponses:

2 pour la réponse № 1

La seule (triste) explication est que XAML est uncitoyen de deuxième niveau dans Visual Studio. Une fois que vous commencez à pousser XAML un peu plus que de base et que vous vous retrouvez avec "non résolu" "ne peut pas afficher" "désolé je" suis stupide ", etc.

Reportez-vous à cette suggestion WPF: http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/480899-make-xaml-a-first-class-citizen-of-visual-studio?ref=title pour les faire réparer.


1 pour la réponse № 2

Il est possible de faire fonctionner Intellisense à 100% pour un XAML {StaticResource} dans Visual Studio.

Testé sur

  • WPF / C #
  • Visual Studio 2015 Update 3

Étape 1: Transférer les ressources dans un projet partagé

La clé est de déplacer toutes les ressources référencées par ResourceDictionary dans un projet partagé:

entrer la description de l'image ici

Étape 2: Temps de conception Intellisense

Nous n'en sommes pas encore tout à fait là. Le runtime XAML lance le runtime si vous incluez deux fois des ressources.

Si nous incluons un fichier .xaml plusieurs fois dans l'ensemble du projet, nous pouvons l'inclure au moment du design, mais pas au moment de l'exécution:

public class DesignTimeResourceDictionary : ResourceDictionary
{
private Uri source;

public new Uri Source
{
get
{
if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
{
return null;
}

return this.source;
}
set { this.source = value; }
}
}

Ensuite, nous pouvons ajouter des ressources de temps de conception:

<!--Design time resource dictionary, so intellisense will work with with {StaticResource}.-->
<ResourceDictionary.MergedDictionaries>
<dr:DesignTimeResourceDictionary Source="/Project.Name;component/Folder/SharedResourceA.xaml" />
<dr:DesignTimeResourceDictionary Source="/Project.Name;component/Folder/SharedResourceB.xaml" />
</ResourceDictionary.MergedDictionaries>

Si nous utilisons ReSharper, il proposera d'ajouter automatiquement le préfixe de l'espace de noms dans l'en-tête:

xmlns:dr="clr-namespace:MyNamespace;assembly=Project.Name"

Annexe A: Supplément pour les experts: pourquoi la nécessité de l'étape 1?

En passant, Intellisense en XAML est identique àIntellisense en C #: il ne fonctionne qu'avec les sous-projets référencés. C'est pourquoi si les projets A et B veulent partager du code, vous devez le mettre dans une bibliothèque de classes C qui est référencée par les projets A et B.Cela contraste avec C ou C ++ où #incluant un fichier à la racine le fait disponible pour tous les sous-fichiers.

Avec XAML, vous pouvez tricher et ajouter des ressources statiques dans Main Application Project (ci-dessus), et le runtime XAML fonctionnera toujours correctement - mais Intellisense ne fonctionnera pas au moment de la conception, probablement parce qu'il est basé sur le même moteur que celui utilisé pour C # intellisense.

Pour faire fonctionner Intellisense tout le temps en XAML, Visual Studio Intellisense devrait parcourir chaque projet parent (au lieu de simplement descendre vers les projets référencés).