WPF Windows窗体中的ActiveX控件在变为可见后不显示

时间:2012-02-15 03:15:03

标签: wpf mvvm activex windowsformshost

我有一个wpf usercontrol,其中包含一个安装在windowsformhost中的activex控件。 我正在使用MVVM模式 ViewModel1映射到Pure WPF View和 ViewModel2映射到wpf内容和上面的usercontrol

如果ViewModel2为“Hidden”然后变为Visible,则其中的Activex控件不显示(具体而言,我所说的是VLC activex控件)。

我已经使用按钮和用户控件在非MVVM模式中进行了测试。用户控件是隐藏的,直到您按下按钮并发生相同的事情,但如果我在usercontrol中创建一个方法以将activex控件重新附加到windowsformhost,则它会重新出现。如果我从viewmodel调用此方法,那么它仍然是空白的。有谁知道我怎么能再次展示它?

编辑 - 我刚刚发现它是因为我的wpf应用程序中有透明度。似乎不可能在windowsformshost和透明度启用的情况下做我想要的事情。

2 个答案:

答案 0 :(得分:2)

由于没有明显的答案,我将分享我的经验。在wpf窗口中打开透明度时,从隐藏更改为可见时,窗体主机不会刷新。除非它被托管在一个“Allowstransparency = false”的新窗口中,否则我发现无法完成这项工作。

答案 1 :(得分:0)

您是如何设置主动x控件的?以下通常适用于WPF,如果您只需要将其附加到网格中。无需用户控制。:

//Active X Control initializer
private Ax addAxObject<Ax>(Grid container)  
    where Ax : System.Windows.Forms.Control, new() 
{ 
    Ax ax = new Ax();
    var hoster = new System.Windows.Forms.Integration.WindowsFormsHost(); 
    hoster.Child = (System.Windows.Forms.Control)ax; 
    container.Children.Add(hoster); 
    return ax; 
}

private MyActiveXControl myActiveXControl;

public Grid InitializeActiveX(Grid grid)
{
    myActiveXControl = addAxObject<myActiveXControl>(grid);

    return grid;
}

然后您只需将其添加到主窗口中的网格,如下所示:

public MainWindow()
{
    InitializeComponent();

    //initialize Active X control
    gridMain = InitializeActiveX(gridMain);
}

它显示对我来说很好。 (显然不是在设计器中,因为它是以编程方式创建的)