如何解决Blend 4中嵌入式UserControls中的设计时静态资源

Ibr*_*taz 5 wpf user-controls expression-blend-4 c#-4.0

短版本 如何处理嵌入到其他窗口/用户/自定义控件中的UserControl中的静态资源查找?因此,Blend 4可以正确地呈现它@设计时Visual Studio已经为您做的事情.

长版本 正如问题所示,我们有一个窗口,其中包含一些嵌入式用户控件,窗口以及每个嵌入式用户控件都使用静态资源标记扩展来解析对app.xaml文件中合并字典中找到的资源的引用.

当单独打开时,Blend在加载和渲染我在VS Designer Surface中创建的任何示例用户控件时都没有问题.解决我无处不在的无数静态资源标记扩展没有问题.

每当我尝试打开我的'MainWindow.xml'时,(一个窗口控件)我注意到我得到4 - 无法使用Blend 4 创建类型错误实例,很好地告诉我ArtBoard它已经捕获了一些设计时异常.通过将VS调试器实例附加到Blend进一步深入研究这些异常我注意到我引用的每一个静态资源,它抱怨它无法找到它.

作为比较,我查看了我创建的自定义控件,它根本不使用任何静态资源,而是使用本地资源.嵌入到我注意到的UserControl中的这个自定义控件非常好用.我觉得很明显为什么!

在SO上有任何人,有任何想法如何解决这个问题?我尝试了整个'添加设计时字典'< - 部分工作,嵌入式用户控件仍然根本没有创建!

研究

  1. MVVM Light + Blend设计器视图错误:找不到名为"Locator"的资源
  2. 主题使用资源而不混合呕吐

更新:可能的解决方案:

  1. 采用这里介绍的类似方法: GianlucaCucco答案
  2. 将所有静态资源查找转换为UserControls的本地资源?
  3. 将所有静态资源查找转换为动态资源.

这些解决方案都不是很漂亮.=(

Ed *_*pel 1

我的文件中有多个资源Converters.xaml,Blend 曾经抱怨过。我的解决方法是在设计时强制加载该 xaml 文件。

using System;
using System.ComponentModel;
using System.IO;
using System.Windows;
using System.Windows.Markup;

public static class DesignTimeSupport
{
    public static void LoadCommonConvertersForBlend(this ResourceDictionary resourceDictionary)
    {
        if (resourceDictionary == null || !DesignerProperties.IsInDesignTool) return;

        var convertersXamlUri = new Uri("Assets/Converters.xaml", UriKind.Relative);
        var streamInfo = Application.GetResourceStream(convertersXamlUri);
        using (var reader = new StreamReader(streamInfo.Stream))
        {
            var converters = (ResourceDictionary)XamlReader.Load(reader.ReadToEnd());
            resourceDictionary.MergedDictionaries.Add(converters);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

ViewBase在构造函数中调用此方法。

public class ViewBase : Page
{
    public ViewBase()
    {
        Resources.LoadCommonConvertersForBlend();
    }
}
Run Code Online (Sandbox Code Playgroud)

不继承自的类会ViewBase进行自己的调用。