WindowsFormsHost всегда самый верхний из элементов WPF

Как установить z-index windowsformhost, чтобы они не всегда были в верхней части элемента WPF?

4 ответа

Согласно MSDN (Вопросы компоновки для элемента WindowsFormsHost)

Размещенный элемент управления Windows Forms рисуется в отдельном HWND, поэтому он всегда рисуется поверх элементов WPF.

Это ограничение дизайна

Еще одна хорошая статья из MSDN, которая объясняет возможные проблемы при использовании различных графических технологий в Windows, - Обзор технологических регионов

Как бы там ни было, я обнаружил, что для этого существуют некоторые взломы (известные как ограничение воздушного пространства).

Один хак (никогда не пробовал лично, поэтому не уверен, работает ли он) по этой ссылке

Я только что столкнулся с той же проблемой.

Существует потенциальный обходной путь - в зависимости от природы элемента управления Windows Host и элемента WPF, который вы хотите отобразить:

Я связал WindowsFormsHost Контрольного Visibility к свойству в моей модели представления, чтобы позволить мне скрыть хост (и элементы управления на нем), когда я хочу отобразить WPF, который мы хотим отобразить поверх него.

Обновление через несколько лет (2016-09):

Мой следующий ответ, как отмечается в верхнем комментарии, больше не действителен и не был доступен в окончательной версии.NET 4.5 или последующих выпусках. К сожалению, ссылка, которую я включил, по-прежнему содержит информацию о z-порядке для HwndHosts для "текущей версии".NET, что может заставить некоторых поверить, что эта функция действительно существует. Это не так. Там нет обходного пути.

Оригинальный ответ:

Год спустя все изменилось с.NET 4.5. Для тех, кто наткнулся на это, как и я, приведу более обновленную выдержку из пошагового руководства: Организация элементов управления Windows Forms в WPF на MSDN:

По умолчанию видимые элементы WindowsFormsHost всегда рисуются поверх других элементов WPF, и на них не влияет z-порядок. Чтобы включить z-упорядочение, установите для свойства IsRedirected элемента WindowsFormsHost значение true, а для свойства CompositionMode - значение Full или OutputOnly.

Все, что вам нужно сделать, при использовании.NET 4.5, это добавить следующие атрибуты в ваш элемент WindowsFormsHost IsRedirected="True" а также CompositionMode="Full" или же CompositionMode="OutputOnly",

В моей ситуации мой WindowsFormsHost находится в двухрядной сетке. В нижнем ряду есть StackPanel, которая изменяет высоту в зависимости от того, что она содержит. Я обрабатываю это событие StackPanel LayoutUpdated, чтобы изменить размер моего WindowsFormsHost, вычитая его ActualHeight из значения ActualHeight сетки. Обязательно используйте ActualHeight, а не Height.

     void ResizeWinhost()
    {
        mainGrid.UpdateLayout();
        detailPanel.UpdateLayout();
        winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
    }
Другие вопросы по тегам