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

时间:2010-04-19 08:05:26

标签: mvvm-light expression-blend

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

它说找不到名为'Locator'的资源。显然,我没有更改代码中的任何内容,我只是使用数据绑定对话框进行数据绑定...

任何人都面临同样的问题?

7 个答案:

答案 0 :(得分:8)

有两种已知的事件会发生这种情况。

  • 如果在构建应用程序之前更改为Blend,则DLL尚不可用,并且可以看到此错误。构建应用程序解决了这个问题。

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

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

你能做的是

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

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

希望这会有所帮助,

劳伦

答案 1 :(得分: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分钟的工作中找到合适的路径,但如果你像我一样在你的智慧结束时试试这个!

答案 2 :(得分: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" 

答案 3 :(得分:1)

这里解释了原因和解决方法 http://blogs.msdn.com/b/unnir/archive/2009/03/31/blend-wpf-and-resource-references.aspx

看看(b)帖子的一部分。

答案 4 :(得分:1)

我遇到了与用户控制资源类似的问题 我在我的usercontrol 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资源文件名。

希望这有帮助。

答案 5 :(得分:1)

只需在最开始的App.xaml.cs中添加它

这是我的代码

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

public App(){
       main();
}

答案 6 :(得分:0)

确保Blend已打开整个解决方案,而不仅仅是包含视图的单个项目。我右键单击Visual Studio并选择Open In Expression Blend。令我惊讶的是,Blend无法找到解决方案文件,所以它只打开了单个项目。

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