Как разрешить статические ресурсы времени разработки во встроенных пользовательских элементах управления в Blend 4

Краткая версия Как вы обрабатываете поиск статических ресурсов в UserControls, которые встраиваются в другие окна / пользовательские / настраиваемые элементы управления? Чтобы Blend 4 мог правильно отображать во время разработки то, что Visual Studio уже делает за вас.

Расширенная версия. Как следует из вопроса, у нас есть окно, в котором есть некоторые встроенные пользовательские элементы управления, и окно, а также все встроенные пользовательские элементы управления используют расширения разметки статических ресурсов для разрешения ссылок на ресурсы, найденные в объединенном словарь в файле app.xaml.

У Blend нет проблем с загрузкой и рендерингом любого из моих примеров пользовательских элементов управления, которые я создал в VS Designer Surface при индивидуальном открытии. У него нет проблем с разрешением бесчисленных расширений статической разметки ресурсов, которые я использую практически повсюду.

Всякий раз, когда я пытаюсь открыть свой «MainWindow.xml» (элемент управления окном), я замечал, что получаю 4 ошибки - Невозможно создать экземпляр типа, при этом Blend 4 красиво сообщает мне на ArtBoard, что он обнаружил некоторые исключения времени разработки. Углубившись в эти исключения, подключив экземпляр отладчика VS к Blend, я заметил, что каждый статический ресурс, на который я ссылался, жаловался, что не может его найти.

Для сравнения я посмотрел на созданный мной настраиваемый элемент управления, он вообще не использовал никаких статических ресурсов, вместо этого они были локальными ресурсами. Я заметил, что этот настраиваемый элемент управления, встроенный в UserControl, работает довольно хорошо. Думаю, очевидно, почему!

Есть ли у кого-нибудь на SO идеи, как обойти эту проблему? Я попробовал полностью «Добавить словарь времени разработки» ‹- который работает частично, встроенные пользовательские элементы управления по-прежнему не создаются!

Исследование

  1. Ошибка представления дизайнера MVVM Light + Blend: не удается найти ресурс под названием "Локатор"
  2. Темы с использованием ресурсов без рвоты Blend

ОБНОВЛЕНИЕ: возможные решения:

  1. Используйте аналогичный подход, представленный здесь: GianlucaCucco Answer
  2. Преобразовать все поиски статических ресурсов в локальные ресурсы для UserControls?
  3. Вместо этого преобразуйте все поиски статических ресурсов в динамические.

Ни одно из этих решений нельзя назвать красивым. = (


person IbrarMumtaz    schedule 07.06.2012    source источник


Ответы (3)


У меня есть несколько ресурсов в 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, делают свой собственный вызов.

person Ed Chapel    schedule 07.06.2012
comment
Вы пробовали использовать указанное выше условное определение ApplicationDefinition? Вроде было бы проще, если бы работало. Меньше кода = лучше, правда? - person Mike Post; 07.06.2012
comment
Я этого раньше не видел. Однако большая часть наших ресурсов находится за пределами App.xaml и, как следствие, не загружается Blend. Принудительная загрузка четырех других файлов xaml, которые у нас есть, была наименее навязчивым подходом, который мы выбрали. - person Ed Chapel; 07.06.2012
comment
DesignerProperties.IsInDesignTool ??? Это еще один из ваших методов расширения? Можете ли вы также сказать мне, какие пространства имен вы тоже используете? Решарпер сейчас сходит с ума: S - person IbrarMumtaz; 08.06.2012
comment
Resharper иногда борется с Silverlight, верно? Это System.ComponentModel.Designer. Я добавил остальные пространства имен. HTH. - person Ed Chapel; 08.06.2012
comment
TY - Я использовал комбинацию ответов от разных людей, но ваш ответ заставил задуматься и двигаться в правильном направлении. - person IbrarMumtaz; 11.06.2012

Попробуйте этот ответ - это похоже на аналогичную проблему. У меня еще не было возможности использовать его, поэтому мне любопытно узнать, работает ли он для вас. Это определенно менее беспорядочно, чем другие решения.

person Mike Post    schedule 07.06.2012
comment
TY - завтра посмотрим. Мой мозг сейчас перегорел. - person IbrarMumtaz; 07.06.2012

Как ни странно это может показаться (и я не могу найти логическую причину почему), сообщение об ошибке показало ресурс, который он не смог найти, как «maindictionary.xaml», тогда как файл и все ссылки были «MainDictionary.xaml».

Я открыл свойства ресурса в обозревателе решений, изменил имя файла на manidictionary.xaml, затем снова вернулся на MainDictionary.xaml, и пять сообщений об ошибках, которые я получал ... исчезли.

Надеюсь, что этот ответ попадет в руки кого-то еще, кто борется с эзотерической проблемой, и это поможет.

person Clearsoft    schedule 19.04.2015