11

WinForms アプリの ElementHost でホストしようとしている WPF コントロールに問題があります。このコントロールは、もともと別のテスト プロジェクト (WPF アプリ) で開発したルックレス カスタム コントロールです。そこでは明らかに正常に動作しますが、私の WinForms アプリでは、ElementHost が表示される空白の灰色のボックスしか表示されません。

ElementHost を作成、設定、および親 Control に追加するための C# コードを次に示します。

// 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();

したがって、空域の問題などに遭遇していないことはわかっています。

私が疑問に思ったことの 1 つは、元のプロジェクトでは、すべてのルックレス コントロールのスタイルが 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 で実行されていることにも言及する必要があります。

とにかく、今のところ私は困惑しているので、どんな助けも感謝して受け取ります.

どうもありがとう!

バート

4

1 に答える 1

12

返信ありがとうございます。誤解されているかもしれませんが、アプリケーション自体を ElementHost に挿入するのではなく、リソースが通常 Application オブジェクトにあるカスタム要素を使用しようとしています。

幸いなことに、私は答えを見つけました:

http://drwpf.com/blog/2007/10/05/managing-application-resources-when-wpf-is-hosted/

短縮版:

  • App.xaml のビルド アクションを Page に設定する
  • App.xaml のコード ビハインドで、InitializeComponent() を呼び出すだけの既定のコンストラクターを作成します。
  • WinForms アプリが起動したら、App クラスのインスタンスを作成するだけです。

私の WPF コントロールは正常に表示されます。

では、 StackOverflow に投稿したにしか答えが見つからないのはなぜですか?

再度、感謝します、

バート

于 2010-12-01T17:21:17.693 に答える