2

私の WPF アプリケーションには、QuickTime のラッパーとして機能するクラスがあります。私が必要とするすべての特定の機能または単純化された機能を提供します。機能させるには、QuickTime の ActiveX コントロールのインスタンスを作成し、それを有効な Windows フォーム ウィンドウに配置する必要があります。私のアプリは WPF で、コンストラクターは次のように機能します。

public VideoPlayerQT(WindowsFormsHost wfHost) {
    AxQTControl qtControl = new AxQTControl();
    wfHost.Child = qtControl;
}

メインウィンドウで、プレーヤーを次のように使用します。

private VideoPlayerQT videoPlayer;    

private void MainWindow_Loaded(object sender, RoutedEventArgs e) {
    this.videoPlayer = new VideoPlayerQT(myWinFormsHost);
}

これは、WindowsFormsHost を TabControl 内に配置するまで機能します。最初から表示されていないタブに配置したい。

これにより、奇妙な動作が発生します。VideoPlayerQTオブジェクトのコンストラクターはAxQTControl、提供された の中にを配置しようとしWindowsFormsHostますが、まだ表示されていないタブにあると、QuickTime コントロールは をスローしInvalidActiveXStateExceptionます。私は、ActiveX / COM コントロールがそれをスローすると考えています。WindowsFormsHost親タブをクリックして表示するまで、「無効な ActiveX 状態」にあると思います。

私の質問は次のとおりです。どのイベント ハンドラー (どのオブジェクト上) でプレーヤーを構築する必要がありますか? Window_Loaded が発火したときのように、最初は非アクティブな TabItem 内の WindowsFormsHost が準備ができて読み込まれたのはいつですか?

4

1 に答える 1

1

私が思いついた最初の解決策は、TabItem_GotFocusイベントを処理するメソッドでプレーヤーを作成することです。今のところ問題なく動作しますが、この解決策に問題がある場合は、知りたいです:)

また、GotFocusは非常に一般的なイベントであるため、WinFormsホストでこれが問題ない理由を理解するのに苦労しています。答えは、「タブアイテムのコンテンツは、ウィンドウがロードされたときにレンダリングされるのと同じように、フォーカスを受け取ったときにレンダリングされる」のようなものですか?

于 2012-11-20T08:58:28.807 に答える