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;
}