Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual Studio可以';无法在WPF窗口中解析静态资源,即使它在运行时工作-为什么?_Wpf_Visual Studio_Resources_Viewmodel - Fatal编程技术网

Visual Studio可以';无法在WPF窗口中解析静态资源,即使它在运行时工作-为什么?

Visual Studio可以';无法在WPF窗口中解析静态资源,即使它在运行时工作-为什么?,wpf,visual-studio,resources,viewmodel,Wpf,Visual Studio,Resources,Viewmodel,我有一个WPF窗口,正在使用MVVM模式。我将视图模型设置为窗口的资源,如下所示 <Window ...other stuff removed for clarity... xmlns:mvvm="clr-namespace:VisionRT.CRM.WPF.ViewModels.VRTSystems" > <Window.Resources> <mvvm:DhrTemplatesViewModel x:Key="viewmodel" /> <

我有一个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来实现,VisualStudio不会在任何地方显示资源。我可以转到窗口的属性并单击DataContext属性旁边的小图标,单击“应用资源”选项,但它不会将“viewmodel”显示为静态或动态资源。如果我手动输入XAML,然后打开“应用资源”弹出窗口,它会将“viewmodel”下划线为错误,并将鼠标悬停在其上方,显示工具提示“无法解析资源引用”

但是,当我运行应用程序时,它工作正常,因此资源在运行时被解析

有人能解释吗?我真的希望能够通过VS属性编辑器实现这一点,因为我发现这比手动键入XAMl更方便。我也为VS无法解决这个问题而烦恼。这让我觉得我做错了什么

感谢您提供的任何解释。

唯一(悲伤的)解释是XAML是Visual Studio的二年级公民。一旦你开始推XAML的时候比basic稍微多了一点,你就会出现“未解决”、“无法显示”、“对不起,我很笨”等问题


请参考此WPF建议:修复它们。

在Visual Studio中,可以使Intellisense在XAML
{StaticResource}
中100%工作

测试
  • WPF/C#
  • Visual Studio 2015更新3
步骤1:将资源转移到共享项目中 关键是将
ResourceDictionary
引用的所有资源转移到共享项目中:

步骤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>
附录A:专家额外要求:为什么需要第1步? 另一方面,XAML中的Intellisense与C#中的Intellisense相同:它只适用于被引用的子项目。这就是为什么项目A和B想要共享一些代码时,必须将其放入项目A和B所引用的类库C中。这与C或C++相比,其中包含根中的文件使其可以对所有子文件可用。

使用XAML,您可以欺骗并将静态资源添加到
主应用程序项目中
(如上),XAML运行时仍能正常工作-但Intellisense在设计时无法工作,可能是因为它基于用于C#Intellisense的同一个引擎


要使Intellisense在XAML中始终工作,Visual Studio Intellisense必须向上扫描每个父项目(而不是向下扫描引用的项目)。

您好,感谢(悲伤的)解释。我确实在这里取得了一些进展,我只是注意到在弹出窗口中列为本地的资源实际上是app.xaml中定义的全局资源。XAML的Window.Resources部分中定义的内容根本没有列出。所以我想我的问题是为什么没有列出窗口资源,以及我应该如何使用它们(不需要手动编写XAML,这不是世界末日,但对于类似的事情来说不应该是必要的)。我投票赞成这一建议,我也将此作为一个单独的bug提交给了,所以请投票赞成,让我们看看我们是否可以改进VS中的XAML支持。感谢您的回复。有意思的想法,一定要尝试一下!不客气。这件事多年来一直困扰着我。它早就该修好了。如果XAML运行时可以找到它,那么Intellisense也应该能够找到它,即使它必须在父项目中查找定义。
xmlns:dr="clr-namespace:MyNamespace;assembly=Project.Name"