Элемент управления WPF не отображается в ElementHost в приложении WinForms - PullRequest
10 голосов
/ 01 декабря 2010

У меня проблема с элементом управления 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 Ответ

11 голосов
/ 01 декабря 2010

Спасибо за ответ, но, думаю, вы меня не так поняли: я пытаюсь использовать пользовательский элемент, ресурсы которого обычно находятся в объекте 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 выглядит так, как должен.

Теперь, почему я нахожу ответ только после , который я отправил в StackOverflow?

Еще раз спасибо,

Bart

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...