在WindowsFormsHost工具栏覆盖(Toolbar Overlay over Window

2019-09-18 16:44发布

我有嵌入在WindowsFormsHost控件WPF窗口内的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 :(
}

在这个问题上任何有识之士将不胜感激。


更新:由于没有合适的答案贴出来,我下面放置自己的解决方案。 我意识到这更是一个比黑客的解决方案,所以我愿意接受其他建议。

Answer 1:

这里是我的hackaround WindowsFormsHost Z-指数的问题。

这个想法是把任何你需要将被覆盖嵌套在弹出里面。 然后更新按该弹出窗口的位置, 这个答案每当窗口大小/移动。

注意:您可能还需要在窗口被激活/停用处理事件,所以当窗口不清晰的(或在另一窗口)弹出消失。

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


Answer 2:

我发现另一种解决方案是使用Windows窗体ElementHost控件。 由于我使用的是Windows窗体一个WPF窗口内,无论如何,为什么不使用一个完整的Windows窗体和拯救自己Z-问题头痛。

ElementHost控件是真正有用的,因为我仍然可以使用我的工具栏用户控件,并将其嵌入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);
}

需要注意的是孩子没有在设计器中设置。 我发现,对于更复杂的用户控件的设计师会抱怨(虽然什么也没有发生在运行时)。

该解决方案是,当然,仍然没有完全理想,但它提供了两全其美的:我仍然可以在XAML代码我的用户控件,但现在我不担心Z-索引问题。



文章来源: Toolbar Overlay over WindowsFormsHost