Элемент управления WPF не отображается в ElementHost в приложении WinForms
У меня проблема с элементом управления WPF, который я пытаюсь разместить в ElementHost в приложении WinForms. Элемент управления представляет собой пользовательский элемент управления без внешнего вида, который я изначально разработал в отдельном тестовом проекте, который представлял собой приложение WPF. Там он, очевидно, работает нормально, но в моем приложении WinForms все, что я получаю, - это пустое серое поле, где отображается ElementHost.
Вот мой код C# для создания, заполнения и добавления ElementHost в родительский элемент управления:
// This is my WPF control
m_TabHostPanel = new TabHostPanel();
m_ElementHost = new ElementHost
{
Child = m_TabHostPanel,
Dock = DockStyle.Top,
Height = 34
};
this.Controls.Add( m_ElementHost );
Родительский элемент управления содержит другие элементы управления WinForms, которые при необходимости добавляются и удаляются во время выполнения. Все они размещаются отдельно с установленным Dock DockStyle.Fill. Таким образом, каждый раз, когда я добавляю один, я отправляю ElementHost в конец Z-порядка, чтобы убедиться, что он отображается правильно:
m_ElementHost.SendToBack();
Таким образом, я знаю, что у меня нет проблем с воздушным пространством или чего-то подобного.
Одна вещь, которая меня удивила, заключается в следующем: в исходном проекте стили для всех моих элементов управления без внешнего вида были объединены в словарь ресурсов для приложения в App.xaml, например так:
<Application x:Class="WpfTestApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Application/UserInterface/DataTemplates/TabModelDataTemplate.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/HoverablePressableButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/MiniControlButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabCloseButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabScrollLeftButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabScrollRightButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabListDropDownButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabHostComboBoxStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabButtonStyle.xaml"/>
<ResourceDictionary Source="Application/UserInterface/Styles/TabHostPanelStyle.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
Я перенес App.xaml в свой проект WinForms, но действие сборки установлено на Page. Если я устанавливаю его в ApplicationDefinition, я получаю сообщение об ошибке, в котором говорится, что приложение имеет несколько точек входа, что имеет смысл, но мне интересно, будут ли выбираться стили и т. Д. Если нет, то это может объяснить, почему я получаю пустой серый прямоугольник там, где должен находиться мой элемент управления, потому что без них нет ничего, чтобы определить его внешний вид. Так что, возможно, вопрос в том, как мне вставить эти стили в мое приложение WinForms, чтобы мои элементы управления WPF могли их видеть?
Я должен также упомянуть, что это работает на.NET Fx 3.5.
Во всяком случае, сейчас я озадачен, поэтому любая помощь будет принята с благодарностью.
Большое спасибо!
Барт
1 ответ
Спасибо за ответ, но я думаю, вы меня не так поняли: я пытаюсь использовать пользовательский элемент, ресурсы которого обычно находятся в объекте Application, а не вставлять само приложение в ElementHost.
К счастью, я нашел ответ:
http://drwpf.com/blog/2007/10/05/managing-application-resources-when-wpf-is-hosted/
Укороченная версия:
- Установите действие сборки для App.xaml в Page
- В коде для App.xaml создайте конструктор по умолчанию, который просто вызывает InitializeComponent()
- Когда приложение WinForms запускается, просто создайте экземпляр класса App.
А потом все хорошо: мой элемент управления WPF выглядит так, как должен.
Теперь, почему я нахожу ответ только после публикации в Stackru?
Еще раз спасибо,
Барт