MVVM Light + Blend конструктор ошибок: не удается найти ресурс с именем «Локатор». - PullRequest
17 голосов
/ 19 апреля 2010

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

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

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

Ответы [ 7 ]

8 голосов
/ 21 апреля 2010

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

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

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

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

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

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

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

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

Laurent

7 голосов
/ 26 августа 2010

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

5 голосов
/ 20 марта 2012

В 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" 
1 голос
/ 20 сентября 2012

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

вот мой кусок кода

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

public App(){
       main();
}
1 голос
/ 15 января 2012

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

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

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

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

1 голос
/ 27 сентября 2011

Причина и обходной путь объяснены здесь http://blogs.msdn.com/b/unnir/archive/2009/03/31/blend-wpf-and-resource-references.aspx

Посмотрите на (б) часть поста.

0 голосов
/ 12 августа 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...