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

как установить z-index windowsformhost, что они не всегда находятся в верхней части элемента 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;
    }