Как сделать окно без рамки 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 . Я хочу сам указать границу окна, и мне не нужно, чтобы пользователи могли изменять размер окна со всех четырех сторон, но мне нужна ручка изменения размера.

Может ли кто-нибудь подробно описать простой способ соответствовать всем этим критериям?

  1. Не иметь границу с Window кроме того, что я указываю в ControlTemplate .
  2. Do есть рабочая ручка изменения размера в правом нижнем углу.
  3. Не есть строка заголовка.

задан 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, потому что здесь я не нашел места опубликовать учебник.

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

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