Преобразование приложения WPF в UserControl для использования в приложении WinForms через ElementHost
Я пытаюсь преобразовать это приложение WPF в WPF UserControl, чтобы я мог использовать его в приложении WinForms через ElementHost. Я новичок в WPF и никогда не касался его до этой попытки, так что я могу поступить совершенно неправильно. Я получил проект UserControl для компиляции, однако, мои StaticResources подчеркнуты в VS с сообщением " Ресурс 'x' не может быть разрешен ". Я попытался переместить xamls с необходимыми элементами x:Key на один уровень вверх (на тот же уровень, что и UserControl Dijagram.xaml), но он все еще не может их разрешить.
В приложении WinForms при попытке добавить UserControl через конструктор, выбрав размещенный контент в задачах ElementHost, я получаю следующую ошибку: " Произошла ошибка при создании объекта типа" DijagramLC.Dijagram ". Убедитесь, что тип имеет значение по умолчанию конструктор. "(хотя конструктор по умолчанию существует).
Однако, если я добавлю это в codebehind, вот так:
wpfUserControl = new Dijagram();
elementHost1.Child = wpfUserControl;
Controls.Add(elementHost1);
код компилируется, но выдает эту ошибку времени выполнения: " System.Windows.Markup.XamlParseException:" Предоставить значение для "System.Windows.StaticResourceExtension", вызвало исключение ". Номер строки '20' и позиция строки '4'. ---> System.Exception: Невозможно найти ресурс с именем 'MyToolbar'. Имена ресурсов чувствительны к регистру. "
Я пробовал с и без App.xaml и добавлением элементов ResourceDictionary для проблемных xamls, но в основном я понятия не имею, что я делаю:)
Я загрузил код в свой SkyDrive и был бы очень признателен, если бы кто-нибудь взглянул и рассказал мне, что я делаю неправильно: https://skydrive.live.com/redir.aspx?cid=21be1f8e850e85cc&resid=21BE1F8E850E85CC!353
Я ненавижу вслепую прыгать в новую техонолию, подобную этой, но на этот раз у меня не было выбора, и мне нужно знать, выполнимо ли мое требование таким образом.
2 ответа
Проблема в том, что вам нужен конструктор по умолчанию, например так:
public CreatedPollsUC()
{
InitializeComponent();
}
Если у вас есть другой код в конструкторе, происходит ошибка:
public CreatedPollsUC()
{
InitializeComponent();
// ... more code
}
Поэтому, если вы хотите использовать дополнительный код в конструкторе, вам необходимо сначала применить элемент управления к элементу host. Затем вы можете редактировать конструктор.
Вы, вероятно, получаете ошибку, потому что вы используете ресурсы из словаря ресурсов, который не загружен. Загрузка словаря ресурсов в приложение хостинга, вероятно, решит проблему:
// When hosting a WPF usercontrol inside an element host,
// application resources are not loaded, so we need to load them manually.
var resources = new ResourceDictionary
{
Source = new Uri("/UNIT4.MKB.GUI.XAML.Dashboard.Resources;component/resources.xaml", UriKind.Relative)
};
// Check for null reference
if (Application.Current != null)
{
//Merge the loaded ResourceDictornairy with the dummy application Resources.
Application.Current.Resources.MergedDictionaries.Add(resources);
}