Ошибка MVVM Light + Blend: не удается найти ресурс с именем "Locator".
Приложение работает нормально, но я не мог видеть свой дизайн в дизайнере.
В нем говорится: "Не удается найти ресурс с именем" Локатор ". Очевидно, я ничего не изменил в коде, я просто привязал данные, используя диалог привязки данных...
кто сталкивается с одной и той же проблемой?
Ответы
Ответ 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"
Ответ 4
Причина и обходное объяснение здесь
http://blogs.msdn.com/b/unnir/archive/2009/03/31/blend-wpf-and-resource-references.aspx
Посмотрите на (b) часть сообщения.
Ответ 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 в моем представлении.