Подтвердить что ты не робот

Ошибка MVVM Light + Blend: не удается найти ресурс с именем "Locator".

Приложение работает нормально, но я не мог видеть свой дизайн в дизайнере.

В нем говорится: "Не удается найти ресурс с именем" Локатор ". Очевидно, я ничего не изменил в коде, я просто привязал данные, используя диалог привязки данных...

кто сталкивается с одной и той же проблемой?

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Лоран

Ответ 2

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

а затем в элементе управления сделайте это ПЕРЕД ИнициализациейComponent():

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

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

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

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

Ответ 3

В MyUserControl.xaml вместо:

DataContext="{Binding Main, Source={StaticResource Locator}

использование:

d:DataContext="{Binding Main, Source={StaticResource Locator}

где "d" ранее было определено как:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

Ответ 5

У меня была аналогичная проблема с ресурсом управления пользователями.
Я добавил это в свой код xaml usercontrol:

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/GinaControls;component/Resources/GinaControlsColors.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</UserControl.Resources>

Где GinaControls - это пространство имен, в котором объявлен класс управления, а /Resources/GinaControlsColors.xaml - папка проекта и имя файла ресурса xaml.

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

Ответ 6

Просто добавьте это в свой App.xaml.cs в самом начале

здесь мой фрагмент кода

[STATThread()]
static void main(){
       App.Current.Resources.Add("Locator", new yournamespace.ViewModel.ViewModelLocator());
}

public App(){
       main();
}

Ответ 7

Убедитесь, что Blend открыл все решение, а не только один проект, содержащий представления. Я щелкнул правой кнопкой мыши в Visual Studio и выбрав Open In Expression Blend. К моему удивлению, Blend не смог найти файл решения, поэтому он только открыл один проект.

Когда я это понял, я сразу же запустил Blend, указал на файл решения, а затем Blend смог найти ViewModelLocator в моем представлении.