5

简短版 您如何处理嵌入到其他窗口/用户/自定义控件中的用户控件中的静态资源查找?因此,Blend 4 可能会在 Visual Studio 已经为您完成的设计时正确呈现它。

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

在单独打开时,Blend 可以毫无问题地加载和渲染我在 VS Designer Surface 中制作的任何示例用户控件。它可以解决我几乎在任何地方都使用的无数静态资源标记扩展。

每当我尝试打开我的“MainWindow.xml”(一个窗口控件)时,我注意到我收到了 4 - Cannot Create Instance Of Type错误,Blend 4 在 ArtBoard 上很好地告诉我它已经捕获了一些设计时异常。通过将 VS 调试器实例附加到 Blend 来进一步深入研究这些异常,我注意到我引用的每一个静态资源,它都抱怨找不到它。

作为比较,我查看了我创建的自定义控件,它根本没有使用任何静态资源,而是本地资源。我注意到这个自定义控件嵌入到 UserControl 时效果很好。我认为原因很明显!

SO上有没有人知道如何解决这个问题?我尝试了整个 'Add a Design-Time Dictionary' < - 部分工作,嵌入式用户控件仍然没有创建!

研究

  1. MVVM Light + Blend 设计器视图错误:找不到名为“定位器”的资源
  2. 使用没有混合呕吐的资源进行主题化

更新:可能的解决方案:

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

这些解决方案都不漂亮。= (

4

3 回答 3

1

试试这个答案——这听起来像一个类似的问题。我还没有机会使用它,所以我很想知道它是否适合你。它肯定没有其他解决方案那么混乱。

于 2012-06-07T15:43:38.387 回答
1

我在一个Converters.xamlBlend 曾经抱怨过的文件中有几个资源。我的解决方法是在设计时强制加载该 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);
        }
    }
}

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

public class ViewBase : Page
{
    public ViewBase()
    {
        Resources.LoadCommonConvertersForBlend();
    }
}

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

于 2012-06-07T15:54:59.170 回答
0

尽管看起来很奇怪(而且我找不到合乎逻辑的原因),但错误消息将它找不到的资源显示为“maindictionary.xaml”,而文件和所有引用都是“MainDictionary.xaml”。

我在解决方案资源管理器中打开了资源的属性,将 FileName 更改为 manidictionary.xaml,然后又回到 MainDictionary.xaml,我收到的五个错误消息......消失了。

希望这个答案能传到可能正在为深奥问题苦苦挣扎的其他人手中,并有所帮助。

于 2015-04-19T02:52:00.243 回答