如何在Blend 4中解决嵌入式用户控件的设计时静态资源问题

5

简短版

如何处理在嵌入到其他窗口/用户/自定义控件中的UserControl中的静态资源查找?这样,Blend 4可以在设计时正确地呈现它,而Visual Studio已经为您完成了。

详细版

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

当我单独打开在VS Designer Surface中制作的任何示例用户控件时,Blend没有任何加载和呈现的问题。它没有任何问题解析我几乎在任何地方使用的无数静态资源标记扩展。

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

作为比较,我看了看我创建的一个自定义控件,它根本没有使用任何静态资源,而是使用了本地资源。当我注意到将此自定义控件嵌入到UserControl中时,它工作得非常好。我认为这很明显!

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

研究

  1. MVVM Light + Blend designer view error: Cannot find resource named 'Locator'
  2. Theming using resources without Blend vomitting

更新:可能的解决方案:

  1. 采用此处提供的类似方法:GianlucaCucco Answer
  2. 将所有静态资源查找转换为UserControl的本地资源?
  3. 将所有静态资源查找转换为动态资源。

这些解决方案都不太好看。=(

3个回答

1

尝试这个答案--听起来像是一个类似的问题。我还没有使用过它,所以我很想知道它是否适用于您。它肯定比其他解决方案更简洁。


TY - 明天我会看一下。我现在的大脑已经炸了。 - IbrarMumtaz

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);
        }
    }
}

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

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

没有继承自ViewBase的类会自己调用。


你尝试过上面提到的条件ApplicationDefinition吗?如果它能工作,似乎会更容易。少写代码=更好,对吧? - Mike Post
我以前没见过这个。然而,我们大部分的资源都在App.xaml之外,因此没有被Blend加载。强制加载其他4个xaml文件是我们采用的最不具侵入性的方法。 - Ed Chapel
DesignerProperties.IsInDesignTool是另一个您的扩展方法吗?您能告诉我使用了哪些命名空间吗?目前Resharper出了点问题。 - IbrarMumtaz
Resharper有时候在Silverlight方面会遇到问题,对吧?这是System.ComponentModel.Designer的问题。我已经添加了其他的命名空间。希望对你有所帮助。 - Ed Chapel
TY - 我结合了不同人的答案,但是你的答案让我思考并朝着正确的方向前进。 - IbrarMumtaz

0

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

我在解决方案资源管理器中打开了该资源的属性,将文件名更改为manidictionary.xaml,然后再次更改为MainDictionary.xaml,我遇到的五个错误消息...消失了。

希望这个答案能够传达给其他可能正在苦苦挣扎于这个玄学问题的人,并且对他们有所帮助。


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