MVVM Light + Blend 设计视图错误:找不到名为“Locator”的资源。

17

应用程序可以正常运行,但我在设计器视图中看不到我的设计。

它显示“无法找到名为'Locator'的资源”。显然,我没有改变代码,我只是使用数据绑定对话框进行了数据绑定...

有人遇到同样的问题吗?


非常惊讶这个问题竟然没有任何收藏或点赞!! - Simon_Weaver
1
作为一个主要使用混合工具的人,这让我想刺死某个人... - BentOnCoding
1
我在Visual Studio 2011中遇到了这个问题,通过将有问题的"{StaticResource Foo}"更改为"{DynamicResource Foo}"来解决它。希望这能帮助到某些人。 - Tower
7个回答

8

有两种情况会出现这种错误。

  • 如果在构建应用程序之前切换到Blend,则DLL尚不可用,会出现此错误。构建应用程序可以解决此问题。

  • Expression Blend中存在一个错误,如果您将用户控件放置在另一个用户控件(或WPF中的窗口)中,并且内部用户控件使用全局资源,则无法找到全局资源。在这种情况下,您也会收到错误信息。

不幸的是,对于第二点,我没有解决方法,因为这是Blend的错误。我希望我们很快能看到解决方案,但似乎在Blend 4中仍然存在。

您可以采取以下措施:

  • 在处理外部用户控件时,请忽略此错误。当您处理内部用户控件时,您应该可以正常看到设计时数据(我知道这不是很令人满意)。

  • 使用d:DataContext在Blend中暂时设置设计时数据上下文。

希望这可以帮助你,

Laurent


你觉得我下面的解决方案怎么样?我不是很喜欢它,但它还算能用。 - Simon_Weaver
这是一个有趣的方法。我知道你不喜欢它的原因。另一方面,如果代码被干净地隔离(设计时代码),并且它确实可以让你在工具中更轻松地完成工作...那么,为什么不呢。无论如何,谢谢。 - LBugnion
我遇到了后面的问题,这里的任何修复方法似乎都没有帮助!微软如何让它在VS2010中工作而不是在Blend 4中? - jimplode

7

我想到了一个相对可接受的解决方案,因为这个问题似乎在Blend 4中没有得到解决:

在XAML UserControl的构造函数中添加所需的资源,前提是你正在Blend的设计模式下。这可能仅仅是定位器,或者也包括适当的样式和转换器。

public partial class OrdersControl : UserControl
{
    public OrdersControl()
    {
        //  MUST do this BEFORE InitializeComponent()
        if (DesignerProperties.GetIsInDesignMode(this))
        {
             if (AppDomain.CurrentDomain.BaseDirectory.Contains("Blend 4"))
            {
                // load styles resources
                ResourceDictionary rd = new ResourceDictionary();
                rd.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "Resources/Styles.xaml"), UriKind.Absolute);
                Resources.MergedDictionaries.Add(rd);

                // load any other resources this control needs such as Converters
                Resources.Add("booleanNOTConverter", new BooleanNOTConverter());
            }
        }

        // initialize component
        this.InitializeComponent();

}

可能会有一些特殊情况,但在我处理简单情况时,它能正常工作,而之前我只会得到一个大红色错误标志。我非常希望能够看到更好的解决此问题的建议,但至少这样可以让我动画化用户控件,否则它们会出现错误。


您还可以将资源的创建提取到 App.xaml.cs 中:

    internal static void CreateStaticResourcesForDesigner(Control element)
    {
        if (AppDomain.CurrentDomain.BaseDirectory.Contains("Blend 4"))
        {
            // load styles resources
            ResourceDictionary rd = new ResourceDictionary();
            rd.Source = new Uri(System.IO.Path.Combine(Environment.CurrentDirectory, "Resources/Styles.xaml"), UriKind.Absolute);
            element.Resources.MergedDictionaries.Add(rd);

            // load any other resources this control needs
            element.Resources.Add("booleanNOTConverter", new BooleanNOTConverter());
        }
    }

然后在控件中,在 InitializeComponent() 之前执行以下操作:

     // create local resources
     if (DesignerProperties.GetIsInDesignMode(this))
     {
         App.CreateStaticResourcesForDesigner(this);
     }

注意:在某个时间点,这对我来说停止工作了,我最终硬编码了Styles.xaml的路径,因为我尝试弄清楚我在哪个目录下而感到沮丧。
rd.Source = new Uri(@"R:\TFS-PROJECTS\ProjectWPF\Resources\Styles.xaml", UriKind.Absolute);

如果你像我一样,已经束手无策了,那么我相信只需要5分钟的工作就能找到正确的路径!但是请尝试以下方法:


@jimplode 看一下我刚刚添加的注释。 - Simon_Weaver

5
在MyUserControl.xaml中,不要使用以下代码:
DataContext="{Binding Main, Source={StaticResource Locator}

使用:

d:DataContext="{Binding Main, Source={StaticResource Locator}

其中“d”已经被先前定义为:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

这种方法有什么好处?我是一个Blend新手,所以我正在努力理解其他人提出的解决方案。 - IbrarMumtaz

1

我曾遇到一个与用户控件资源类似的问题。
我在我的用户控件XAML代码中添加了以下内容:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/GinaControls;component/Resources/GinaControlsColors.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

GinaControls 是控件类声明的命名空间,/Resources/GinaControlsColors.xaml 是项目文件夹和 xaml 资源文件名。

希望这可以帮到你。


1

只需在您的App.xaml.cs文件的开头添加以下代码:

这是我的代码片段:

[STATThread()]
static void main(){
       App.Current.Resources.Add("Locator", new yournamespace.ViewModel.ViewModelLocator());
}

public App(){
       main();
}

1

0

确保 Blend 已经打开了整个解决方案,而不仅仅是包含视图的单个项目。我曾在 Visual Studio 中右键单击并选择“在 Expression Blend 中打开”。令我惊讶的是,Blend 找不到解决方案文件,因此只打开了单个项目。

当我意识到这一点时,我直接启动了 Blend,指向了解决方案文件,然后 Blend 能够在我的视图中找到 ViewModelLocator。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接