WindowsFormsHost всегда самый верхний из элементов WPF - PullRequest
12 голосов
/ 29 марта 2012

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

Ответы [ 4 ]

13 голосов
/ 29 марта 2012

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

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

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

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

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

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

2 голосов
/ 02 июня 2016

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

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

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

2 голосов
/ 09 апреля 2013

Обновление, несколько лет спустя (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".

0 голосов
/ 19 августа 2016

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

     void ResizeWinhost()
    {
        mainGrid.UpdateLayout();
        detailPanel.UpdateLayout();
        winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
    }
...