как установить z-index windowsformhost, что они не всегда находятся в верхней части элемента WPF?
WindowsFormsHost всегда самый верхний элемент WPF
Ответ 1
В соответствии с MSDN (Сопоставление макетов для элемента WindowsFormsHost)
Элемент управления Windows Forms размещается в отдельном HWND, поэтому он всегда нарисованные поверх элементов WPF.
Это ограничение по дизайну
Еще одна хорошая статья из MSDN, которая объясняет возможные проблемы при использовании разных графических технологий в Windows, - Обзор технологий >
Как бы то ни было, я обнаружил, что для этого существуют некоторые хаки (известные как ограничение воздушного пространства)
Один взлом (никогда не пробовал это лично, поэтому не уверен, что он работает) на эта ссылка
Ответ 2
Обновление через несколько лет (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"
.
Ответ 3
Я только что столкнулся с той же проблемой.
Существует потенциальное обходное решение - в зависимости от характера окна управления Windows Host и элемента WPF, который вы хотите отобразить:
Я привязал элемент управления WindowsFormsHost
Visibility
к свойству в моей модели просмотра, чтобы я мог скрыть хост (и элементы управления на нем), когда я хочу отобразить WPF, который мы хотим отобразить над ним.
Ответ 4
В моей ситуации мой WindowsFormsHost находится в двух рядах Grid. Нижняя строка содержит StackPanel, которая меняет высоту в зависимости от того, что она содержит. Я обрабатываю это событие StackPanel LayoutUpdated, чтобы изменить размер моего WindowsFormsHost, вычитая его ActualHeight из Grid ActualHeight. Обязательно используйте ActualHeight not Height.
void ResizeWinhost()
{
mainGrid.UpdateLayout();
detailPanel.UpdateLayout();
winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
}