Преобразование приложения 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 ». Убедитесь, что тип имеет конструктор по умолчанию. "(хотя конструктор по умолчанию существует).

Однако, если я добавлю его в программный код, например:

wpfUserControl = new Dijagram();
elementHost1.Child = wpfUserControl;
Controls.Add(elementHost1);

код компилируется, но выдает следующую ошибку времени выполнения: «System.Windows.Markup.XamlParseException: 'Provide value on' System.Windows.StaticResourceExtension 'вызвал исключение.' Номер строки '20' и позиция строки '4'. ---> System.Exception: не удается найти ресурс с именем 'MyToolbar'. Имена ресурсов чувствительны к регистру. "

Я пробовал с App.xaml и без него и добавлял элементы ResourceDictionary для проблемных xamls, но в основном я понятия не имею, что делаю :)

Я загрузил код в свой SkyDrive и был бы очень признателен, если бы кто-нибудь взглянул и сказал мне, что я делаю не так: https://skydrive.live.com/redir.aspx?cid=21be1f8e850e85cc&Остаток=21BE1F8E850E85CC!353

Я ненавижу слепо бросаться в такую ​​новую техонолию, как эта, но на этот раз у меня не было выбора, и мне нужно знать, достижимы ли мои требования таким образом.


person dr.lijenjin    schedule 28.07.2011    source источник


Ответы (2)


Проблема в том, что вам нужен такой конструктор по умолчанию:

public CreatedPollsUC()
{
    InitializeComponent();
}

Если в конструкторе есть какой-либо другой код, возникает ошибка:

public CreatedPollsUC()
{
    InitializeComponent();
    // ... more code
}

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

person Herdo    schedule 20.03.2013
comment
Привет, спасибо за этот ответ. Как сначала применить контроль? - person Khawaja Asim; 09.04.2018
comment
@KhawajaAsim Какой контроль применить? - person Herdo; 09.04.2018
comment
'вам нужно сначала применить элемент управления к хосту элемента. Затем вы можете редактировать конструктор. ' эта строка. - person Khawaja Asim; 11.04.2018
comment
@KhawajaAsim Это означает, что InitializeComponent должен быть первой строкой в ​​конструкторе. - person Herdo; 13.04.2018
comment
@KhawajaAsim вы нашли решение этой проблемы? - person Umar Dastgir; 04.07.2018
comment
@UmarDastgir добавьте элемент хоста на родительскую панель и щелкните значок моркови в дизайне, чтобы добавить назначенную CC. - person Khawaja Asim; 05.07.2018

Вероятно, вы получаете сообщение об ошибке, потому что используете ресурсы из не загруженного словаря ресурсов. Загрузка словаря ресурсов в хостинг-приложение, вероятно, решит проблему:

// 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);
}
person Kalix    schedule 16.01.2012
comment
Где вы вводите этот код? Вы должны делать это для каждого ресурса в объединенном словаре? - person jmgardn2; 27.05.2015