在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状态”,直到单击并显示其父选项卡。

我的问题是:应该在哪个事件处理程序(在哪个对象上)构造播放器? WindowsFormsHost最初处于非活动状态的TabItem何时准备就绪并已加载,就像Window_Loaded触发时一样?

最佳答案

我想到的第一个解决方案是在处理TabItem_GotFocus事件的方法中创建播放器。目前工作正常,但是如果对此解决方案有任何疑问,我想知道:)

另外,由于GotFocus是这样的常规事件,因此我很难理解为什么WinForms主机确实可以这样做。答案是否只是像“ tabitem的内容在获得焦点时呈现,就像窗口在加载时呈现”那样?

关于c# - WPF:TabItem何时真正加载,呈现并完全准备就绪?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13469552/

10-17 01:53