我有嵌入在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 :(
}
在这个问题上任何有识之士将不胜感激。
更新:由于没有合适的答案贴出来,我下面放置自己的解决方案。 我意识到这更是一个比黑客的解决方案,所以我愿意接受其他建议。
这里是我的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(); }
我发现另一种解决方案是使用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-索引问题。