Свет MVVM + ошибка представления разработчика Смешения: не Может найти ресурс под названием 'Локатор'.

Прекрасное выполнение приложения, но я не видел свой дизайн в представлении разработчика.

Это говорит, не Может найти ресурс под названием 'Локатор'. Очевидно, я ничего не изменил в коде, я просто сделал привязку данных с помощью диалогового окна привязки данных...

кто-либо сталкивающийся с той же проблемой?

17
задан Vadim Kotov 1 November 2017 в 12:33
поделиться

2 ответа

Есть два известных случая, когда это может произойти.

  • Если вы переключитесь на Blend до создания приложения, библиотеки DLL еще будут недоступны, и эта ошибка будет видна. Сборка приложения решает проблему.

  • В Expression Blend есть ошибка, при которой, если вы помещаете пользовательский элемент управления в другой пользовательский элемент управления (или Window в WPF), а внутренний пользовательский элемент управления использует глобальный ресурс, глобальный ресурс не может быть найден. В этом случае вы тоже получите ошибку.

К сожалению, у меня нет обходного пути для второго пункта, так как это ошибка Blend. Я надеюсь, что мы скоро увидим решение для этого, но, похоже, оно все еще присутствует в Blend 4.

Что вы можете сделать, так это

  • Игнорировать ошибку при работе с внешним пользовательским элементом управления. Когда вы работаете с внутренним пользовательским элементом управления, вы должны видеть данные времени разработки в порядке (я знаю, это не очень удовлетворительно).

  • Используйте d: DataContext, чтобы временно установить контекст данных времени разработки в Blend.

Надеюсь, это поможет,

Лоран

8
ответ дан 30 November 2019 в 13:27
поделиться

Я придумал разумно приемлемое решение этой проблемы, так как оно не было исправлено в 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();

}

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


Вы также можете извлечь создание ресурсов в 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());
        }
    }

, а затем в элементе управления сделайте это ДО InitializeComponent():

     // create local resources
     if (DesignerProperties.GetIsInDesignMode(this))
     {
         App.CreateStaticResourcesForDesigner(this);
     }

Примечание. В какой-то момент это перестало работать для меня, и я закончил тем, что жестко запрограммировал путь к Styles.xaml, потому что я получил разочаровался, пытаясь выяснить, в каком каталоге я был.

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

Я уверен, что смогу найти правильный путь за 5 минут работы, но попробуйте это, если вы, как и я, не в своем уме!

7
ответ дан 30 November 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: