Элемент управления ActiveX в узле Windows Form WPF не отображается после того, как стал видимым

У меня есть пользовательский элемент управления wpf, который содержит элемент управления ActiveX, расположенный в windowsformhost. Я использую шаблон MVVM, в котором говорится, что ViewModel1 сопоставлен с чистым представлением WPF, а ViewModel2 сопоставлен с содержимым wpf и указанным выше пользовательским управлением

Если ViewModel2 имеет значение «Скрытый», а затем становится видимым, тогда элемент управления Activex внутри него не отображается (в частности, я говорю об элементе управления Activex VLC).

Я тестировал шаблон без MVVM с помощью кнопки и пользовательского элемента управления. Пользовательский элемент управления скрыт до тех пор, пока вы не нажмете кнопку, и произойдет то же самое, но если я создам метод в пользовательском элементе управления для повторного присоединения элемента управления activex к windowsformhost, он снова появится. Если я вызываю этот метод из модели просмотра, он все равно остается пустым. Кто-нибудь знает, как я могу заставить это снова показать?

ИЗМЕНИТЬ - Я только что обнаружил это, потому что в моем приложении wpf включена прозрачность. Кажется, невозможно делать то, что я хочу, с включенными windowsformshost и прозрачностью.


person Oli    schedule 15.02.2012    source источник


Ответы (2)


Поскольку однозначных ответов нет, поделюсь своим опытом. Когда в окне wpf включена прозрачность, узел формы окна не обновляется при переходе со скрытого на видимый. Я не нашел способа выполнить эту работу, если она не размещена в новом окне с параметром «Allowstransparency = false».

person Oli    schedule 23.05.2012

Как вы настраиваете свой активный элемент управления 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);
}

Меня это устраивает. (Очевидно, не в дизайнере, так как он создается программно)

person Gaff    schedule 15.02.2012
comment
У меня есть windowsformshost в моей сетке под названием VlcHost - затем я добавляю его во время инициализации пользовательского управления с помощью _vlcPlayer = new AxVLCPlugin2 (); VlcHost.Child = _vlcPlayer; - Это работает нормально, но если я скрою пользовательский элемент управления, а затем снова сделаю его видимым, элемент управления activex не будет виден - он все еще доступен, поскольку я могу установить новый источник, и я могу здесь аудио из воспроизводимого видео. - person Oli; 15.02.2012