3

WPF ウィンドウ内の WindowsFormsHost コントロールに SWF オブジェクトが埋め込まれています。

swf ムービーにツールバーを追加したいと思います。

以下のコード スニペットの問題は、新しい子がホスト コントロールに追加されたとき (またはムービーが読み込まれたとき、まだどれかわかりません)、ツールバーが事実上非表示になることです。swf の z-index が何らかの理由で一番上に設定されているようです。

これは次のようになります。

XAML:

<Grid Name="Player">
   <WindowsFormsHost Name="host" Panel.ZIndex="0" />
   <Grid Name="toolbar" Panel.ZIndex="1" Height="50"
      VerticalAlignment="Bottom">
           [play, pause, seek columns go here]
   </Grid>
</Grid>

C#:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
   flash = new AxShockwaveFlashObjects.AxShockwaveFlash();
   host.Child = flash;
   flash.LoadMovie(0, [movie]); // Movie plays, but no toolbar :(
}

この問題に関する洞察をいただければ幸いです。


更新:適切な回答が投稿されていないため、独自のソリューションを以下に配置しました。これは解決策というよりもハックであることを認識しているので、他の提案も受け付けています。

4

2 に答える 2

1

これは、WindowsFormsHost Z-index の問題に対する私のハックアラウンドです。

アイデアは、オーバーレイする必要があるものをポップアップ内にネストして配置することです。次に、ウィンドウのサイズが変更/移動されるたびに、この回答に従ってそのポップアップの位置を更新します。

注: ウィンドウがアクティブ化/非アクティブ化されたときにイベントを処理したい場合もあります。そのため、ウィンドウがフォーカスから外れると (または別のウィンドウの背後に)、ポップが消えます。

XAML:

<Window [stuff]
   LocationChanged="Window_LocationChanged"
   SizeChanged="Window_SizeChanged" >
   <Grid Name="Player">
   [same code as before]
       <Popup Name="toolbar_popup" IsOpen="True" PlacementTarget="{Binding ElementName=host}">
           [toolbar grid goes here]
       </Popup>
   </Grid>
</Window>

C#:

private void resetPopup()
{
   // Update position
   // https://stackoverflow.com/a/2466030/865883
   var offset = toolbar_popup.HorizontalOffset;
   toolbar_popup.HorizontalOffset = offset + 1;
   toolbar_popup.HorizontalOffset = offset;

   // Resizing
   toolbar_popup.Width = Player.ActualWidth;
   toolbar_popup.PlacementRectangle = new Rect(0, host.ActualHeight, 0, 0);
   toolbar_popup.Placement = System.Windows.Controls.Primitives.PlacementMode.Top;
}
private void Window_LocationChanged(object sender, EventArgs e)
{ resetPopup(); }

private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{ resetPopup(); }
于 2012-07-05T16:06:29.840 に答える
0

私が発見した別の解決策は、Windows フォームの ElementHost コントロールを使用することです。とにかく、私は WPF ウィンドウ内で Windows フォームを使用しているので、Windows フォーム全体を使用して、Z-Issue の頭痛の種から解放されませんか。

ElementHost コントロールは非常に便利です。ツールバーの UserControl を引き続き使用して、Windows フォーム内に埋め込むことができるからです。Windows フォームでは子を追加するのが面倒な場合があることを発見したので、解決策を説明するスニペットを次に示します。

まず、デザイナーを使用して、ActiveX オブジェクトを投入し、次に ElementHost コントロールを投入します。

Form1.Designer.cs:

private AxShockwaveFlashObjects.AxShockwaveFlash flash;
private System.Windows.Forms.Integration.ElementHost elementHost1;

Form1.cs

public Form1(string source)
{
     InitializeComponent();
     toolbar = new UserControl1();
     this.elementHost1.Child = this.toolbar;
     this.flash.LoadMovie(0, source);
}

デザイナーで子が設定されていないことに注意してください。より複雑な UserControls の場合、デザイナーが文句を言うことがわかりました (ただし、実行時には何も起こりません)。

もちろん、このソリューションはまだ完全に理想的ではありませんが、両方の長所を提供します。XAML で UserControls をコーディングすることはできますが、Z インデックスの問題について心配する必要はありません。

于 2012-07-24T15:56:10.253 に答える