Преобразование приложения 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);
}
Другие вопросы по тегам