即使在运行时Visual Studio无法在WPF窗口中解析静态资源,为什么?

| 我有一个WPF窗口,正在使用MVVM模式。我将视图模型设置为窗口的资源,如下所示...
<Window
  ...other stuff removed for clarity...
  xmlns:mvvm=\"clr-namespace:VisionRT.CRM.WPF.ViewModels.VRTSystems\"
>
<Window.Resources>
  <mvvm:DhrTemplatesViewModel x:Key=\"viewmodel\" />
</Window.Resources>
我想将窗口的数据上下文设置为使用资源,并发现以下XAML起作用...
  <Window.DataContext>  
    <StaticResource ResourceKey=\"viewmodel\"/> 
  <Window.DataContext> 
问题是我只能通过手动键入XAML来执行此操作,Visual Studio不会在任何地方显示资源。我可以转到窗口的属性,然后单击DataContext属性旁边的小图标,单击“应用资源”选项,但它不会将“ viewmodel”显示为静态或动态资源。如果我手动输入XAML,然后打开\“ Apply resource \”弹出窗口,则会在\“ viewmodel \”下划线显示为错误,并且将鼠标悬停在其上会显示工具提示\“无法解析资源引用\” 但是,当我运行该应用程序时,它运行良好,因此在运行时正在解析资源。 有人可以解释吗?我真的很希望能够通过VS属性编辑器来执行此操作,因为与手动输入XAM1相比,这更方便。 VS无法解决它也使我感到困扰。这使我觉得自己做错了。 感谢您提供的任何解释。     
已邀请:
唯一(不好)的解释是XAML是Visual Studio中的二等公民。一旦开始将XAML推向基础之上,最终会得到\“ unresolved \” \“ cant display \” \“对不起,我很傻”,等等。 请参阅以下WPF建议:http://dotnet.uservoice.com/forums/40583-wpf-feature-suggestions/suggestions/480899-make-xaml-a-first-class-citizen-of-visual-studio?ref=修复它们的标题。     
对于Visual Studio中的XAML
{StaticResource}
,可以使Intellisense 100%工作。 经过测试 WPF / C# Visual Studio 2015更新3 步骤1:将资源转移到共享项目中 关键是将ѭ3引用的所有资源转移到共享项目中: 步骤2:设计时间智能 我们还没到那儿。如果您两次包含资源,则XAML运行时将引发运行时。 如果我们在整个项目中多次包含一个.xaml文件,则可以在设计时包含它,但不能在运行时包含它:
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; }
    }
}
然后,我们可以添加设计时间资源:
<!--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>
如果我们使用的是ReSharper,它将提供自动将名称空间前缀添加到标题中的功能:
xmlns:dr=\"clr-namespace:MyNamespace;assembly=Project.Name\"
附录A:专家额外信息:为什么需要执行步骤1? 顺便说一句,XAML中的Intellisense与C#中的Intellisense相同:它仅适用于引用的子项目。这就是为什么如果项目A和B要共享一些代码,则必须将其放在项目A和B引用的类库C中。这与C或C ++相反,在C或C ++中,在根中包含文件使它成为代码可用于所有子文件。 使用XAML,您可以作弊并将静态资源添加到“ 7”中(如上所述),并且XAML运行时仍然可以正常工作-但Intellisense在设计时将无法正常工作,大概是因为它基于用于C#intellisense的同一引擎。 若要使Intellisense始终在XAML中工作,Visual Studio Intellisense将必须向上扫描每个父项目(而不是向下扫描到引用的项目)。     

要回复问题请先登录注册