Wpf как сделать окно прозрачным

Обновлено: 13.05.2024

WPF создает высокопроизводительные окна с прозрачным фоном (используйте WindowChrome вместо AllowsTransparency = True)

В WPF, если вы хотите создать окно особой формы с прозрачным фоном, вам в основном нужно установить WindowStyle="None" 、 AllowsTransparency="True" Эти два атрибута. Если вы не хотите настраивать стиль окна, вам также необходимо установить Background="Transparent" . Такая настройка сделает окно многоуровневым, и производительность рендеринга WPF в этом типе окна будет очень плохой.

В этой статье описывается, как использовать WindowChrome Без настройки AllowsTransparency="True" Создавайте окна специальной формы с прозрачным фоном, чтобы избежать низкой производительности рендеринга, вызванной окнами специальной формы.

Содержание этой статьи

Инопланетное окно с прозрачным фоном

Ниже приведен пример окна специальной формы с прозрачным фоном:

Это окно имеет большие закругленные углы, а также содержит DropShadowEffect Произведенный теневой эффект. Для непрозрачных окон этого добиться невозможно.

Как добиться

Чтобы получить такое окно особой формы с прозрачным фоном, вам необходимо установить следующие три свойства для окна:

  • WindowStyle="None"
  • ResizeMode="CanMinimize" Или же ResizeMode="NoResize"
  • WindowChrome.GlassFrameThickness="-1" Или установите другое большее положительное число (вы можете попробовать эффект после настройки самостоятельно)

Ниже приводится простейший пример: я выделил три наиболее важных атрибута.

Основные методы, распространяющиеся в Интернете

Среди основных методов, распространенных в Интернете, AllowsTransparency="True" Это важный шаг, который также требует WindowStyle="None" . Но обычно я категорически против того, чтобы все это делали, потому что AllowsTransparency="True" Это вызовет очень серьезные проблемы с производительностью.

Если вы заметили другие мои блоги, вы обнаружите, что когда я настраиваю стиль окна, я стараюсь избегать установки этого свойства крайне низкой производительности:

Сравнение производительности

Поскольку о производительности особенно много говорят, это тоже необоснованно, чтобы говорить, нам нужны данные.

Ниже приведен пример, который я использовал для тестирования производительности рендеринга:

По сравнению с приведенным выше примером, он предназначен в основном для добавления эффекта фоновой анимации, который можно использовать для проверки частоты кадров.

Так как же работают данные о производительности? Мы позволяем отображать это окно в полноэкранном режиме на экране 2560 × 1080 и получаем следующие данные:

Программа WindowChrome AllowsTransparency
Частота кадров (кадров в секунду)Чем больше значение, тем лучше, 60 - лучший 59 19
Частота обновления грязных областей (кадров / с)Чем больше значение, тем лучше 117 38
Занятая видеопамять (МБ)Чем меньше значение, тем лучше 83.31 193.29
Целевой номер межкадрового рендеринга (а)Чем больше значение, тем лучше 2 1

Кроме того, для использования видеопамяти, если я выполняю рендеринг в полноэкранном режиме на экране 7680 × 2160, WindowChrome План остается на уровне 80+ МБ, а AllowsTransparency Он достиг ошеломляющих 800 + МБ.

Видно, что для производительности рендеринга используйте WindowChrome Полностью нарушаются характеристики производимого окна специальной формы с прозрачным фоном. AllowsTransparency Создаваемое фоновое прозрачное окно особой формы фактически соответствует производительности без прозрачного окна.

 WindowChrome

 AllowsTransparency

Сравнение функций

поскольку WindowChrome Метод используется для завершения настроек, распространенных в Интернете, с точки зрения производительности. AllowsTransparency Метод, а как насчет функции?

Стоит отметить, что за счет использования WindowChrome Установить при создании прозрачного окна ResizeMode="None" , Таким образом, когда вы перетаскиваете окно вверх, а также в левую и правую части экрана, Windows больше не поможет вам развернуть окно или закрепить его сбоку, поэтому вам нужно обработать это самостоятельно. Однако функция перетаскивания строки заголовка окна по-прежнему сохраняется, и меню, вызываемое правой кнопкой мыши в строке заголовка, можно продолжать использовать.

Программа WindowChrome AllowsTransparency
Перетащите строку заголовка, чтобы переместить окно Хранить Сделай сам
Свернуть кнопку максимального закрытия Потерянный Потерянный
Перетащите края, чтобы изменить размер окна Потерянный Потерянный
Переместите окно вверх, чтобы развернуть Потерянный Сделай сам
Перетащите, чтобы развернуть строку заголовка окна, чтобы восстановить окно Хранить Сделай сам
Переместите окно к обеим сторонам экрана, чтобы закрепить его боком Потерянный Сделай сам
Перетащите и встряхните окно, чтобы свернуть другие окна Хранить Сделай сам
Анимация открытия / закрытия / минимизации / развертывания / восстановления окна Потерянный Потерянный

  • Хранить Указывает, что эту функцию можно продолжать поддерживать без какой-либо обработки
  • Сделай сам Указывает, что эта функция исчезла, но требуется всего одна или две строки кода, чтобы восполнить эту функцию
  • Потерянный Указывает, что эта функция исчезла, и для ее реализации необходимо написать много кода.

Кроме того, приведенная выше таблица предназначена только для окна управления мышью. Если посчитать использование прикосновения для работы с окном, то все теги Сделай сам Станет Потерянный . Потому что, хотя вы можете составить функцию в одном предложении, вы не можете решить различные ошибки с помощью сенсорного управления .

Между этими двумя реализациями окон есть некоторые функциональные различия:

Программа WindowChrome AllowsTransparency Описание
Пролистать Щелкните полностью прозрачную часть и по-прежнему щелкните свое собственное окно. Нажмите на полностью прозрачную часть, чтобы перейти в другие окна ниже благодаряnocanstillbb (huang bin bin) Предоставленная информация

Если вы видите в блоге что-то, чего не понимаете, сообщите об этом. я построилдотнет профессионально-технический колледж Приглашаем всех присоединиться.

На днях, после долгого перерыва, надо было поработать на WPF, и возникло желание заменить поднадоевший стандартный вид окон Windows 7 на что-нибудь более вдохновляющее, скажем в стиле Visual Studio 2012:


Переходить на Windows 8 ради этого еще не хотелось, как и добавлять в проекты ссылки на метро-подобные библиотеки и разбираться с ними — это будет следуюшим шагом. А пока было интересно потратить вечер и добиться такого результата с минимальными изменениями рабочего кода. Забегая вперед, скажу что результат, как и планировалось, получился довольно чистым: фрагмент следующего кода, если не считать нескольких аттрибутов пропущенных для наглядности, это и есть окно с первого скриншота. Все изменения ограничились заданием стиля.



Дальше я остановлюсь на ключевых моментах и подводных камнях при создания стиля окна. Демонстрационный проект доступен на github'е, если вы захотите поразбираться с исходниками самостоятельно или же просто использовать этот стиль не вдаваясь в подробности.

Основная проблема

WPF не работает с NC-area. NC, она же «Non-client area», она же «не-клиентская часть», она же хром, обрабатывается на более низком уровне. Если вам захотелось изменить какой-то из элементов окна — бордюр, иконку, заголовок или кнопку, то первый совет, который попадается при поиске — это убрать стиль окна и переделать все самому. Целиком.


За всю историю развития WPF в этом отношении мало что изменилось. К счастью, у меня были исходники из старинного поста Алекса Яхнина по стилизации под Офис 2007, которые он писал работая над демо проектом по популяризации WPF для Микрософта, так что с нуля начинать мне не грозило.


В итоге нам надо получить один стиль, и по возможности, без дополнительных контролов: в дереве проекта XAML и код стиля расположились в директории CustomizedWindow, а основное окно в корне проекта.

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

Создаем стиль


Сразу же определим кнопки управления окном в стиле Студии 2012. Это будет единственный дополнительный глобальный стиль на случай если потом возникнет желание использовать такие кнопки в приложении.


Нам нужна функциональность обычной кнопки, но с очень примитивной отрисовкой — фактически только фон и содержимое.

Изображения на кнопках проще всего сделать «в векторе». Например, вот так выглядит maximize:

Для текста заголовка используем стандартный шрифт Segoe UI. Единственная особенность здесь — убедиться, что текст отрисован без размытия, иначе заголовок окна будет выглядеть… плохо он будет выглядеть — как во второй строчке на скриншоте.


Кстати, для Path'а на кнопках с той же целью использовался EdgeMode=«Aliased», а
для текста в WPF 4+ появилась долгожданная возможность указать, что отображаться он будет на дисплее, а не на «идеальном устройстве», что и позволило добиться приемлимой четкости на наших неидеальных экранах.


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

Остальные детали менее существенны, но если интересно, добро пожаловать в исходники.

Оживляем окно

Помимо реакции на кнопки и иконку, окно должно перемещаться и изменять размер при drag'е за заголовок, за края и уголки. Соответствующие горячие зоны проще всего задать при помощи невидимых контролов. Пример для левого верхнего (северо-западного) угла.


При наличие атрибута Class в ресурсах, методы этого класса можно вызывать просто по имени как обычные обработчики событий, чем мы и воспользовались. Сами обработчики, например MinButtonClick и OnSizeNorthWest, выглядят примерно так:


DragSize далее вызывает WinAPI (исходник) и заставляет Windows перейти в режим измененения размера окна как в до-дотнетовские времена.

В 4.5 появились удобные классы SystemCommands и WindowChrome. При добавлении к окну, WindowChrome берет на себя функции изменения размера, положения и состояния окна, оставляя нам более «глобальные» проблемы.

Почти готово. Зададим триггеры для контроля изменений интерфейса при изменении состояния окна. Вернемся в XAML и, например, заставим StatusBar'ы изменять цвет в зависимости от значения Window.IsActive.

Обратите внимание, что этот стиль влияет не на темплэйт окна, а на контролы помещенные в наше окно. Помните самый первый фрагмент с пользовательским кодом?

Собираем все вместе

Все. Нам осталось только подключить стиль к проекту через ресурсы приложения:



И можно использовать его в любом окне.

P.S. Еще раз ссылка на исходники на github'е для тех кто сразу прокрутил вниз ради нее.

В отличие от многих старых технологий построения пользовательских интерфейсов (например, Windows Forms), WPF поддерживает настоящую прозрачность. Это значит, что если поместить несколько фигур (или других элементов) друг поверх друга и указать для них различные уровни прозрачности, то в результате будет получено именно то, чего следует ожидать. В простейшем виде это средство дает возможность создавать графический фон, который "просматривается" сквозь элементы, помещенные сверху. В более сложной форме это средство позволяет создавать многослойную анимацию и получать другие эффекты, которые было бы чрезвычайно трудно реализовать на других платформах.

Существует несколько способов сделать элемент полупрозрачным:

Установка свойства Opacity элемента

Каждый элемент, включая фигуры, наследует свойство Opacity (прозрачность) от базового класса UIElement. Прозрачность — это дробное значение от 0 до 1, где 1 означает полную непрозрачность (и принято по умолчанию), а 0 — полную прозрачность. Например, значение прозрачности 0,9 создает эффект 90% видимости (10% прозрачности). Установленная подобным образом прозрачность влияет на визуальное содержимое всего элемента.

Установка свойства Opacity кисти

Каждая кисть также наследует свойство Opacity от базового класса Brush. Устанавливая значение этого свойства от 0 до 1, можно управлять прозрачностью содержимого, которое рисует кисть, будь то сплошной цвет, градиент либо некоторого рода текстура или изображение. Поскольку для свойств Stroke и Fill фигуры используются разные кисти, можно задавать разную степень прозрачности для ее границы и поверхности.

Использование цвета, имеющего непрозрачное значение альфа-канала

Любой цвет, который имеет значение альфа-канала менее 255, является полупрозрачным. Например, можно установить полупрозрачный цвет для кисти SolidColorBrush и применять ее для рисования фона или переднего плана элемента. В некоторых ситуациях использование полупрозрачных цветов работает лучше, чем установка свойства Opacity.

Ниже показан пример с несколькими полупрозрачными слоями:

Окно с несколькими полупрозрачными слоями

В данном примере следует отметить следующие моменты:

Окно имеет непрозрачный белый фон.

Панель StackPanel верхнего уровня, содержащая все элементы, имеет кисть ImageBrush с изображением. Свойство Opacity этой кисти уменьшено для осветления изображения, чтобы белый фон окна просматривался сквозь него.

Первая кнопка использует полупрозрачный красный цвет фона. (Для отображения этого цвета WPF "за кулисами" создает кисть SolidColorBrush.) Изображение просматривается сквозь фон кнопки, но ее текст непрозрачен.

Метка (под первой кнопкой) используется в том виде как есть. По умолчанию все метки имеют полностью прозрачный фон.

Текстовое поле использует сплошной цвет текста и сплошной цвет контура, но полупрозрачный цвет фона.

Еще одна панель StackPanel под текстовым полем использует кисть TileBrush для создания шаблона из повторяющихся смайликов. TileBrush имеет уменьшенное значение Opacity, так что просматривается фон. Например, можно видеть изображение солнца в нижнем правом углу формы.

Во второй панели StackPanel находится элемент TextBlock с полностью прозрачным фоном (по умолчанию) и полупрозрачным белым текстом. Присмотревшись внимательно, можно заметить, что оба фона просматриваются сквозь некоторые буквы.

Прозрачность — популярное средство WPF. Фактически благодаря простоте использования и эффективной работе, прозрачность превратилась в своего рода клише внутри WPF. По этой причине злоупотреблять им не стоит.

Класс Window унаследован от класса ContentControl. Это означает, что он может содержать только одного потомка (каковым обычно является контейнер компоновки наподобие элемента управления Grid) и что его фон можно закрашивать с помощью кисти путем установки свойства Background.

Можно еще также использовать и свойства BorderBrush и BorderThickness для добавления вокруг окна границы, но эта граница добавляется внутри оконной рамки (то есть по краю клиентской области). Оконную рамку можно вообще удалять путем установки для свойства WindowStyle значения None, что позволяет создавать полностью настраиваемое (т.е. имеющее специальную форму) окно.

— это область внутри окна. Именно в ней размещается содержимое. К не клиентской области относится граница и строка заголовка в верхней части окна. За управление этой областью отвечает операционная система.

Помимо этого, класс Window имеет небольшой набор членов, знакомых любому программисту для Windows. Наиболее очевидными из них являются свойства, которые касаются внешнего вида и позволяют изменять способ отображения не клиентской части окна. Основные члены класса Window перечислены ниже:

AllowsTransparency

Если установлено в true, класс Window позволяет другим окнам "проглядывать" через данное при условии, что для фона был установлен прозрачный цвет. В случае установки в false (поведение по умолчанию), находящееся позади данного окна содержимое не "просматривается", и прозрачный цвет фона визуализируется как черный. В случае использования в комбинации со свойством WindowsStyle, установленным в None, это свойство позволяет создавать окна, имеющие необычную форму.

Icon

Объект imageSource, идентифицирующий значок, который должен использоваться для данного окна. Значки отображаются в левом верхнем углу окна (если в нем применяется один из стандартных стилей границ), в панели задач (если свойство ShowInTaskBar установлено в true) и в окне выбора, которое появляется, когда пользователь нажимает комбинацию клавиш для перехода между работающими приложениями. Поскольку эти значки имеют разные размеры, в используемом для них файле .ico должны содержаться изображения с размерами как минимум 16x16 и 32x32 пикселя.

В последних версиях ОС Windows (Windows Vista и Windows 7) добавлен новый стандарт для значков 48x48 и 256x256 пикселей, размер которых можно изменять. Если свойство Icon установлено в null, окно получает тот же значок, что и приложение (значок для которого можно указать в Visual Studio, дважды щелкнув на узле Properties (Свойства) в окне Solution Explorer и перейдя на вкладку Application (Приложение)). Если свойство вообще опущено, WPF для изображения окна будет использовать стандартный, но непримечательный значок

Тор и Left

Определяют расстояние между левым верхним углом окна и левыми верхними краями экрана (в независимых от устройства единицах). При изменении любого из них генерируется событие LocationChanged. Если свойство WindowStartupPosition установлено в Manual, значения этих свойств можно указывать до появления окна для определения, задавая его начальную позицию. Какое бы значение не использовалось для WindowStartupPosition, эти свойства можно устанавливать в любой момент после отображения окна, изменяя его текущую позицию

ResizeMode

Принимает значение перечисления ResizeMode, которое определяет, может ли пользователь изменять размеры окна. Также влияет на видимость кнопок, отвечающих за разворачивание и сворачивание окна. Чтобы полностью заблокировать размеры окна, используйте значение NoResize. Чтобы пользователь мог только сворачивать окно, применяйте значение CanMinimize. Чтобы пользователь мог изменять размер окна всеми возможными способами, указываете значение CanResize. Чтобы в правом нижнем углу окна отображалась еще и визуальная подсказка, указывающая, что размеры окна разрешено изменять, задавайте значение CanResizeWithGrip.

RestoreBounds

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

ShowInTaskBar

Если установлено в true, окно отображается в панели задач и списке, появляющемся после нажатия комбинации клавиш . Обычно это свойство устанавливается в true только для главного окна приложения.

SizeToContent

Позволяет создать окно, которое автоматически увеличивается в соответствии с размерами содержимого. Это свойство принимает значение перечисления SizeToContent. Чтобы отключить автоматическое изменение размеров окна, используйте значение Manual. Чтобы окно могло увеличиваться в различных направлениях в соответствии с размерами динамического содержимого, применяйте, соответственно, значение Height, Width или WidthAndHeight. При установке значения SizeToContent окно может увеличиваться в размерах в соответствии с содержимым так, что будет выходить за пределы экрана.

Title

Заголовок, который отображается в строке заголовка окна (и в панели задач)

Topmost

Если установлено в true, окно всегда отображается поверх остальных окон в приложении (если только у них это свойство также не равно true). Такая настройка очень удобна для палитр, которые обычно должны "плавать" над другими окнами

WindowStartupLocation

Принимает значение перечисления WindowStartupLocation. Для размещения окна в конкретной позиции с помощью свойств Left и Тор используйте значение Manual. Для размещения окна по центру экрана применяйте значение CenterScreen. Для размещения окна с учетом позиции того окна, которое его запустило, указывайте значение CenterOwner. При отображении немодального окна с использованием значения CenterOwner удостоверьтесь, что свойство Owner нового окна установлено перед тем, как показывать его.

WindowState

Принимает значение перечисления WindowState. Информирует о том, в каком состоянии находится окно: развернутом, свернутом или обычном (и позволяет изменить его). При изменении значения этого свойства генерируется событие StateChanged

WindowStyle

Принимает значение перечисления WindowStyle, которое определяет внешний вид границы окна. Возможные значения: SingleBorderWindow (по умолчанию), ThreeDBorderWindow (граница визуализируется несколько иным образом в Windows ХР), ToolWindow (отображается тонкая граница, удобная для "плавающих" окон с инструментами без кнопок сворачивания и разворачивания) и None (визуализируется очень тонкая приподнятая граница без области для строки заголовка). Увидеть разницу можно на рисунке ниже:


1, используйте скольжение Применимый сценарий: динамическая конфигурация фона изображения 2, на картину Гаусс, вам нужно передавать картинки на битовые объекты Не рекомендую: Используйте растровое изо.


Установите Spark 2.2.1 под облачным сервером Alibaba centos7.2

Выбор версии при установке Spark связан с версией hadoop. Нажмите, чтобы открыть ссылкуПосле ввода выберите подходящее изображение. При нормальных обстоятельствах можно использовать оба .

Заставьте FireFox fieldset имитировать IE в закругленных углах

Метка набора полей написана в Firefox, углы не закруглены, как в IE, что влияет на внешний вид. Мы можем установить стиль в fieldset: .

Установка MongoDB и базовый синтаксис

Метод вызова Notepad ++ и GVIM в Vivado

Метод вызова Notepad ++ и GVIM в Vivado Позвоните Notepad ++ Позвоните в метод GVIM, это не на этом, потому что в середине программных файлов есть пространство Правильный способ установки его на диск .

Вам также может понравиться

Mangacies-Chesboard танцы (мышление)

Не бойся! Не бойся! Не бойся! 90% мира очень просто. Этот вопрос на самом деле тщательно думает о том, чтобы принимать бумагу и покраску. Он чувствует себя больше в тестовом переводе. .

HDU4506 S Xiaoming Series Story-Brother Help

Ссылка на вопрос:HDU4506 S Xiaoming Series Story-Brother Help。 описание проблемы:Смотрите ссылки, описанные выше. Анализ проблем:(немного). Описание программы: Функция PowerMod () - функция быстрой мо.


Без названия

ООП рассматривает структуру программы со статической точки зрения. ООП абстрагирует сущности, атрибуты и поведение бизнес-процесса, чтобы получить более четкое и эффективное логическое разделен.


Как аудио конвертер перехватывает часть аудио

Когда я слышал несколько хороших песен, я всегда хотел взять музыкальные фрагменты и сделать из них рингтоны для мобильных телефонов. Хотя это и немного клише, но и человеческое. В эту эпоху безмолвия.

Читайте также: