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

Lin*_*nus 17 expression-blend mvvm-light

应用程序运行正常,但我无法在设计器视图中看到我的设计.

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

有人面临同样的问题吗?

LBu*_*ion 8

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

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

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

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

你能做的是

  • 在处理外部用户控件时忽略错误.当你使用内部用户控件时,你应该看到设计时间数据很好(我知道这不是很令人满意).

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

希望这有帮助,

洛朗


Sim*_*ver 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();

}
Run Code Online (Sandbox Code Playgroud)

可能会有一些边缘情况,但在我得到一个大的红色错误符号之前的简单情况下它对我来说工作正常.我很乐意看到有关如何更好地解决这个问题的建议,但这至少允许我设置用户控件的动画,否则这些控件会显示为错误.


您还可以提取资源的创建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());
        }
    }
Run Code Online (Sandbox Code Playgroud)

然后在控件中执行此操作初始化ComponentComponent():

     // create local resources
     if (DesignerProperties.GetIsInDesignMode(this))
     {
         App.CreateStaticResourcesForDesigner(this);
     }
Run Code Online (Sandbox Code Playgroud)

注意:在某个时间点,这停止了为我工作,我最终硬编码到Styles.xaml的路径,因为我很沮丧,试图弄清楚我在哪个目录.

rd.Source = new Uri(@"R:\TFS-PROJECTS\ProjectWPF\Resources\Styles.xaml", UriKind.Absolute);
Run Code Online (Sandbox Code Playgroud)

我确信我能找到合适的路径,只需要5分钟的工作时间,但如果你像我一样在你的智慧结束时试试这个!


Jay*_*eth 5

在MyUserControl.xaml中,而不是:

DataContext="{Binding Main, Source={StaticResource Locator}
Run Code Online (Sandbox Code Playgroud)

使用:

d:DataContext="{Binding Main, Source={StaticResource Locator}
Run Code Online (Sandbox Code Playgroud)

其中"d"先前被定义为:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
Run Code Online (Sandbox Code Playgroud)