Прозрачность окна WPF (включая неклиентскую область)

Есть ли способ сделать окно WPF прозрачным без потери неклиентской области (границы, строка заголовка, кнопки закрытия / минимизации / развертывания)?

Для установки «AllowsTransparency» на «true» необходимо, чтобы для WindowStyle было установлено значение «None» (как описано в this answer), который удаляет неклиентскую область.

Один из разработчиков WPF написал в блоге о том, как прозрачные окна работают в WPF, и почему было бы сложно реализовать поддержку прозрачности неклиентской области.

Независимо от того, что предлагают стили ваших окон, прозрачные окна WPF не имеют видимой неклиентской области. Это нормально для многих сценариев, в которых целью является создание настраиваемой формы окна, но это может раздражать людей, которые просто хотят «исчезнуть» в обычном окне.

Таким образом, решение, предназначенное только для WPF, не может быть и речи.

Вызов собственной функции SetLayeredWindowAttributes и передача дескриптор окна WPF и LWA_ALPHA, как и ожидалось, не действует.

Единственный другой подход, о котором я могу думать, - это размещение содержимого WPF в окне Win32 (или, возможно, WinForms). Однако я подозреваю, что попытка сделать это приведет к проблемам с воздушным пространством.

Многослойные окна WPF имеют разные возможности в разных операционных системах ... WPF не поддерживает цветовые ключи прозрачности, потому что WPF не может гарантировать отображение точного цвета, который вы запрашивали, особенно при аппаратном ускорении рендеринга.

Я не уверен, правильно ли я читаю приведенное выше, но похоже, что попытка разместить контент WPF с прозрачностью невозможна.

Любые идеи?

Прозрачное окно Notepad2


person Quppa    schedule 27.01.2011    source источник


Ответы (3)


Вы можете настроить неклиентскую область, используя библиотеку из ms, которая называется WPF Chrome. Проверьте эту статью: ' Пользовательское окно Chrome ».

С помощью этой библиотеки вы можете сделать хром прозрачным и изменить многое другое.

person bartosz.lipinski    schedule 27.01.2011
comment
Я не думаю, что эта библиотека предоставляет какой-либо механизм для того, чтобы сделать стандартный хром окна прозрачным. Я бы хотел избежать ответственности за неклиентскую область и оставить это на усмотрение DWM. - person Quppa; 28.01.2011

В Fluidkit встроено стеклянное окно, и я думаю, это то, что вам нужно.

person Joel Lucsy    schedule 27.01.2011
comment
Спасибо. Реализация FluidKit GlassWindow выглядит довольно хорошо и позволяет мне установить непрозрачность окна при удалении / замене неклиентской области. Однако я ищу решение, в котором мне не нужно рисовать собственную неклиентскую область. - person Quppa; 28.01.2011

Единственный способ добиться этого - использовать метод setWindowCompositionAttribute() и установить его в недопустимое состояние.

Просто взгляните на этот код: https://github.com/riverar/sample-win32-acrylicblur

Вместо того, чтобы устанавливать для атрибута композиции значение

ACCENT_ENABLE_ACRYLICBLURBEHIND

установить это на

ACCENT_INVALID_STATE

Это сделает клиентскую зону полностью прозрачной.

Примечание: SetWindowCompositionAttribute() является частью недокументированного API. Его можно изменить в любой момент.

person trickymind    schedule 05.08.2020