0

我有一个 wpf 用户控件,其中包含一个位于 windowsformhost 中的 activex 控件。我正在使用一个 MVVM 模式,它说 ViewModel1 被映射到纯 WPF 视图,而 ViewModel2 被映射到 wpf 内容和上面的用户控件

如果 ViewModel2 是“隐藏”,然后变为可见,则其中的 Activex 控件不会显示(具体来说,我说的是 VLC Activex 控件)。

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

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

4

2 回答 2

2

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

于 2012-05-23T18:07:08.483 回答
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);
}

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

于 2012-02-15T04:02:45.247 回答