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