Как сделать окно без рамки wpf
Добавил пользователь Владимир З. Обновлено: 11.09.2024
Ключевым элементом в системе графического интерфейса в WPF является окно, которое содержит все необходимые элементы управления. Окно в WPF представлено классом Window , который является производным от класса ContentControl. Поэтому окно является элементом управления содержимым, и как, к примеру, кнопка, может содержать в себе один дочерний элемент. Как правило, в его качестве выступает один из элементов компоновки, например, Grid.
Класс Window привносит ряд свойств, которые позволяют настроить окно приложения:
AllowsTransparency : при значении true позволяет установить прозрачный фон окна
Icon : представляет иконку, которая отображается в левом верхнем углу окна и в панели задач. Если иконка не установлена, то система будет использовать стандартную иконку по умолчанию.
Top : устанавливает отступ окна приложения от верхней границы экрана
Left : устанавливает отступ окна приложения от левой границы экрана
ResizeMode : задает режим изменения размеров окна. Может принимать следующие значения:
CanMinimize : окно можно только свернуть
NoResize : у окна нельзя изменить начальные размеры
CanResize : у окна можно изменять размеры
CanResizeWithGrip : в правом нижнем углу окна появляется визуализация того, что у окна можно изменять размеры
RestoreBounds : возвращает границы окна
ShowInTaskbar : при значении true иконка окна отображается на панели задач
SizeToContent : позволяет автоматически масштабировать размеры окна в зависимости от содержимого. Может принимать следующие значения:
Width : автоматически масштабируется только ширина
Height : автоматически масштабируется только высота
WidthAndHeight : автоматически масштабируются высота и ширина
Manual : автоматическое масштабирование отсутствует
Title : заголовок окна
Topmost : при значении true окно устанавливается поверх других окон приложения
WindowStartupLocation : устанавливает стартовую позицию окна. Может принимать следующие значения:
CenterOwner : если данное окно было запущено другим окном, то данное окно позиционируется относительно центра запустившего его окна
CenterScreen : окно помещается в центре экрана
Manual : позиция устанавливается вручную с помощью свойств Top и Left
WindowState : состояние окна. Возможные значения:
Maximized : раскрыто на весь экран
Normal : стандартное состояние
Жизненный цикл
В процессе работы окно в WPF проходит ряд этапов жизненного цикла, которые доступны нам через обработку событий класса Window:
Initialized : это событие возникает при инициализации окна, когда у него устанавливаются все свойства, но до применения к нему стилей и привязки данных. Это общее событие для всех элементов управления в WPF, поэтому следует учитывать, что сначала возникают события вложенных элементов, а затем их контейнеров. То есть событие Initialized окна приложения генерируется только после того, как отработает событие Initialized для всех вложенных элементов.
Loaded : возникает после полной инициализации окна и применения к нему стилей и привязки данных. После генерации этого события происходит визуализация элемента, и окно отображается на экране и становится видимым для пользователя
Closing : возникает при закрытии окна
Closed : возникает, когда окно становится закрытым
Unloaded : возникает после закрытия окна при выгрузке всех связанных ресурсов из памяти
Соответственно, если нам надо выполнить некоторые действия при загрузке или при закрытии окна, мы можем обработать события Loaded и Closing/Closed. Например, запишем в текстовый лог события жизненного цикла:
Есть ли способ в WPF, где я могу удалить границу главного окна, но разрешить изменение размера этого окна (без захвата)?
Я понял, что есть способ сделать этот сценарий, установив режим изменения размера CanResizeWithGrip , Тем не менее, я хочу быть в состоянии сделать это с режимом изменения размера, установленным на CanResize ,
Я попытался установить следующее:
Однако, установив AllowsTransparency , это устраняет возможность изменения размера без захвата. Любые идеи, как я могу это осуществить?
Я также должен отметить, что я не могу установить AllowsTransparency в любом случае, чтобы истина, потому что я использую элемент управления winformshost в моем окне, которое не отображается, когда AllowsTransparency правда.
Если вы установите ResizeMode="CanResizeWithGrip" на WPF Window затем в правом нижнем углу отображается ручка изменения размера, как показано ниже:
Если вы установите WindowStyle="None" также исчезнет строка заголовка, но серый скошенный край останется до тех пор, пока вы не установите ResizeMode="NoResize" . К сожалению, при установке этой комбинации свойств ручка изменения размера также исчезает.
Я переопределил Window 's ControlTemplate через обычай Style . Я хочу сам указать границу окна, и мне не нужно, чтобы пользователи могли изменять размер окна со всех четырех сторон, но мне нужна ручка изменения размера.
Может ли кто-нибудь подробно описать простой способ соответствовать всем этим критериям?
- Не иметь границу с Window кроме того, что я указываю в ControlTemplate .
- Do есть рабочая ручка изменения размера в правом нижнем углу.
- Не есть строка заголовка.
задан 04 марта '09, 14:03
5 ответы
Если вы установите AllowsTransparency собственность на Window (даже без установки каких-либо значений прозрачности) граница исчезнет, и вы сможете изменить размер только с помощью ручки.
Результат выглядит так:
Создан 20 июля '17, 13:07
Чистая случайность. Я знал это - сегодня днем я играл с тем же набором элементов управления. :) - ЗомбиОвца
Вау, я бы этого не ожидал, но он очень удобен для создания собственных заметок за 5 минут, спасибо :) - Томаш Кафка
Тем не менее, AllowTransparency имеет несколько недостатков: Windows больше не может размещать элементы управления подокнами, например, WebBrowser, обычно принудительный программный рендеринг, сообщил об утечках памяти. См. Мой обходной путь ниже. - Колебания
Вам нужно только WindowStyle = "None", чтобы избавиться от границ; AllowsTransparency только требует этого, но не влияет на границы .. - Граулт
@Grault избавляется от заголовка окна, но форма все еще остается сплошной рамкой. AllowsTransparency избавляется от границ. - Колебания
CaptionHeight: Это высота области заголовка (панель заголовка), которая позволяет использовать Aero snap, двойной щелчок, как это делает обычная строка заголовка. Установите значение 0 (ноль), чтобы кнопки работали.
ResizeBorderThickness: Это толщина на краю окна, где вы можете изменить размер окна. Я поставил 5, потому что мне нравится это число, и потому что, если вы поставите ноль, трудно изменить размер окна.
После использования этого короткого кода результат будет следующим:
И теперь белая рамка исчезла без использования ResizeMode="NoResize" и AllowsTransparency="True" , также показывает тень в окне.
Позже я объясню, как заставить работать кнопки (я не использовал изображения для кнопок) легко с помощью простого и короткого кода, я новичок, и я думаю, что могу опубликовать в codeproject, потому что здесь я не нашел места опубликовать учебник.
Возможно, есть другое решение (я знаю, что для таких новичков, как я, есть сложные и сложные решения), но это работает для моих личных проектов.
Читайте также: