Как сделать wpf приложение на весь экран

Обновлено: 19.05.2024

Создавая приложение WPF, первым, с чем Вы столкнетесь будет класс Window. Он служит корневым элементом окна и представляет собой обыкновенную рамку, заголовок и кнопки: "свернуть", "развернуть", "закрыть". Окно WPF - это комбинация файла XAML (.xaml), в котором элемент <Window> является корнем и CodeBehind файла (.xaml.cs). Используя Visual Studio (Express), при создании нового WPF приложения, система автоматически создаст Окно по умолчанию, которое будет выглядеть примерно так:

Атрибут x:class сообщает файлу XAML, какой класс необходимо использовать (в нашем случае Window1), который Visual Studio уже создала для нас. Вы можете найти его в дереве решений Visual Studio как дочерний узел файла XAML. По умолчанию он будет выглядеть так:

Как Вы можете заметить, класс Window1 определен как разделяемый (partial class), так как при создании окна, в ходе исполнения, он сочетается с файлом XAML. Это на самом деле процесс, который реализуется при вызове InitializeComponent(), необходимого для получения полного функционала окна и его запуска.

Если мы вернемся назад, к файлу XAML, то Вы сможете обратить внимание на несколько интересных атрибутов элемента Окно, таких как: Title, который определяет заголовок окна (полоска Title), стартовые ширину и высоту. Так же, здесь находится несколько определений пространств имен, о которых мы поговорим позже.

Обратите внимание, что Visual Studio создала элемент Grid внутри Окна (Window). Grid является одним из контейнеров WPF, который может содержать в себе любые другие контейнеры или элементы управления, в то время как Окно может иметь внутри себя лишь один дочерний элемент. Одним из лучших вариантов такого дочернего контейнеров является элемент Panel. Позже в руководстве мы более подробно познакомимся с различными типами контейнеров, которые вы можете использовать, поскольку это очень важная тема в WPF.

Важные свойства Window

Класс Window имеет несколько интересных атрибутов, которые Вы можете устанавливать для управления внешним видом и поведением окна Вашего приложения. Ниже представлен короткий список самых интересных:

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

ResizeMode — управляет тем, может ли конечный пользователь изменять размер окна. Значение по умолчанию — CanResize, что позволяет пользователю изменять размер окна либо с помощью кнопок "свернуть"/"развернуть", либо перетягиванием за углы курсором мыши. CanMinimize позволяет пользователю свернуть окно, но запрещает разворачивать его на весь экран или изменять его размер. NoResize — самое строгое правило, которое убирает кнопки "свернуть"/"развернуть" и не позволяет менять размер окна.

ShowInTaskbar — по умолчанию имеет значение true, но если переназначить его на false, то окно не будет представлено в панели задач Windows. Это свойство очень полезно, так как позволяет убрать с панели задач вторичные окна или приложения, которые должны быть свернуты в трей.

SizeToContent - Определяет, будет ли Окно автоматически менять свой размер, приспосабливаясь под его контент. Значение по умолчанию - Manual, что значит, что окно не будет автоматически подстраивать свой размер. Другими опциями являются: Width, Height и WidthAndHeight, которые позволяют настроить автоподстройку размера окна по ширине, высоте, либо по двум параметрам сразу.

Topmost - По умолчанию - false, но при переключении на true - Окно буде оставаться на переднем фоне, если его не минимизировать. Свойство полезное, но при узконаправленной задаче.

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

WindowState — регулирует начальное состояние окна. Оно может принимать значения Normal, Maximized или Minimized. По умолчанию Normal, которое используется в случае, если вы не хотите, чтобы при запуске окно было свернуто или развернулось на весь экран.

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

Ключевым элементом в системе графического интерфейса в 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. Например, запишем в текстовый лог события жизненного цикла:

Мне нужно изменить панель задач windows в моем приложении WPF. Для этого я установил WindowStyle="None" , Что означает отключить панель задач windows и сделать пользовательскую панель задач с кнопками для восстановления, минимизации и закрытия приложения. Теперь моя проблема в том, что если приложение находится в режиме максимизации, я не вижу меню "Пуск" в windows.

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

Как я могу создать свою собственную панель задач и увидеть меню "Пуск" windows, когда я развернул его? Есть ли окно свойств в xaml, которое может его установить?

Сделать WPF-приложения в полноэкранный режим (обложка меню)

Я хотел бы сделать мое приложение WPF полноэкранным. Прямо сейчас меню "Пуск" предотвращает его от покрытия всего и сдвигает мое приложение вверх. Это то, что у меня есть для моего главного окна.код xaml:

вы, вероятно, не хватает WindowState="Maximized" , попробуйте следующее:

состояние окна в развернутом и стиль окна В Нет

  • присвоить имя окну (x: Name = "Домашняя страница")
  • в конструкторе просто установите свойство WindowState в развернутое следующим образом

работа с несколькими экранами

когда ты это делаешь код фокус в том, чтобы вызвать

и затем

чтобы получить его для отображения на панели задач.

Как центрировать приложение WPF на экране?

Я хочу, чтобы центр моего приложения WPF при запуске на основном экране. Я знаю, что должен установить свое окно.Слева и мое окно.Топ, но где я могу получить значения?

нашел System.Windows.Forms.Screen.PrimaryScreen , который, по-видимому, не WPF. Есть ли альтернатива WPF, которая дает мне разрешение экрана или что-то в этом роде?

2011-02-18 18:30:14 Indy9000 2011-05-24 16:44:20 Pratik Deoghare

вы все еще можете использовать класс Screen из приложения WPF. Вам просто нужно обратиться к системе.Окна.Формирует сборку из вашего приложения. Как только вы это сделаете, (и ссылочная система.Рисунок для примера ниже):

. прекрасно работать.

вы рассматривали настройка главного окна WindowStartupLocation свойство CenterScreen?

Как насчет класса SystemParameters в PresentationFramework? Он имеет WorkArea свойство, которое кажется то, что вы ищете.

но, почему бы не установить окно.WindowStartupLocation работает? CenterScreen-это одно из значений перечисления. Вам нужно настроить центровку?

вам не нужно ссылаться на System.Windows.Forms сборка из вашего приложения. Вместо этого, вы можете использовать System.Windows.SystemParameters.WorkArea . Это эквивалентно System.Windows.Forms.Screen.PrimaryScreen.WorkingArea !

для центра экрана используйте:

для центра родительского окна используйте:

Как удалить свернуть и развернуть из изменяемого размера окна в WPF?

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

Я украл некоторый код, который я нашел на форумах MSDN и сделал метод расширения в классе Window, например:

единственное, что нужно помнить, это то, что по какой-то причине это не работает из конструктора окна. Я обошел это, бросив это в конструктор:

надеюсь, что это помогает!

enter image description here

один из способов-установить ResizeMode="NoResize" . Он будет вести себя так.

надеюсь, это поможет!



Не знаю, если это работает для вашего Треб. визуально.. Это

если кто-то использует окно Devexpress (DXWindow) принятый ответ не работает. Один уродливый подход

вы можете установить ResizeMode= "NoResize" окна, если вы хотите удалить кнопку Свернуть и развернуть

вот решение, которое я использую. Обратите внимание, что кнопка "развернуть" по-прежнему отображается.

разметка:

код:

Как сделать отображение Windows Forms/WPF приложения на полный экран без рамки?

  • Вопрос задан более трёх лет назад
  • 13383 просмотра

Решения вопроса 1

Для Windows Forms:

Ответ написан более трёх лет назад

Ответы на вопрос 1

Зачем еще лишний код строчить.А не проще в Студии в свойствах окна все выставить.

Ответ написан более трёх лет назад

hardtendo

Разве этот же самый код не появится в "MyForm".Designer.cs?

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

WPF: Нестандартное окно

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



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



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

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

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

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



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

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

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

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



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

XAML стиля кнопки

Изображения на кнопках проще всего сделать «в векторе». Например, вот так выглядит 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.

XAML для StatusBar'а

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

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

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



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

Нестандартное окно WPF. Разворачивание на весь экран

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

94731 / 64177 / 26122 Ответы с готовыми решениями:



Как развернуть нестандартное окно во весь экран?
Подскажите, как развернуть нестандартное окно во весь экран? При разворачивании, окно закрывает.



Нестандартное окно в WPF. Изогнутый текст
Есть вот такое вот окно в приложении WPF: Внутри второго круга мне будет необходимо размещать.

Разворачиваясь на весь экран нестандартное окно уходит за его пределы на 7 пикселей с каждой стороны
Чем это обусловлено? Мне просто нужно вычислять эти отступы, чтобы разворачивая окно оно не.



Разворачивание формы на весь экран
Знатоки, реально ли развернуть форму на весь экран со всеми компонентами кликнув: То есть если.

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

Искренне недоумеваю зачем начинать осваивать wpf с создания кастомного окна.

Dee,Спасибо буду разбираться.

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

Не проще ли в таком случае взять уже готовое? MahApps.Metro, к примеру, разрабатывается уже не один год и позволяет легко сделать приличный metro-подобный GUI.

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

87844 / 49110 / 22898

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



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

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



Корректное разворачивание на весь экран формы с несколькими контролами
Здравствуйте. У меня есть форма, на ней UC на котором два ListView. Один занимает верхнюю.

Окно во весь экран
Скажите пожалуйста как запустить сам паскаль на весь экран если при нажатии alt+enter он.

Развернуть приложение на весь экран

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

94731 / 64177 / 26122 Ответы с готовыми решениями:

MahApps.Metro: развернуть во весь экран
Доброго времени суток. Я уже поднимал этот вопрос. Но результата пока 0. Суть такова. Как.



Как развернуть нестандартное окно во весь экран?
Подскажите, как развернуть нестандартное окно во весь экран? При разворачивании, окно закрывает.

Свой плеер: развернуть его при двойном клике на весь экран
Всем привет!&quot; Сделал простенького плеера но еще хочу чтоб при двойном клике на изображении в.

WPF окна. Стиль None. Растянуть на весь экран.

Если вы вставите себе в любой WPF проект этот код, например на обработчик нажатия кнопки какой нибудь, то у вас сразу без проблем это будет работать. Так вот как видите курсор принимает вид "Рука" и окно растянуто на весь экран и поверх панели задач. Так вот когда вы будете водить по нему курсором, он будет иметь вид руки. А теперь попробуйте переместить курсор в правый угол, там он смениться на стрелочку, так как выйдет за пределы окна. Но я не пойму почему так? Ведь окно растягивается на весь экран. Вот эта проблема портит мне всю малину.
Подскажите как можно обойти эту проблему? Или может это как то решается установкой каких нибудь свойств окна? Или может как-то возможно ограничить движение курсора внутри формы, пока её не закроют?

Добавлено через 12 часов 39 минут
Проблема решилась сама собой, перезагрузил компьютер, проблема исчезла. Кто не понимает о чём вообще речь, вот видео (

314 kb) этой беды.

Я даже решил её так (не забываем это WPF, не WinForms):

Но всё равно это не давало мне покоя 94731 / 64177 / 26122 Ответы с готовыми решениями:

WPF, изменить стиль окна
Здравствуйте, снова прошу помощи, как изменить стиль окна messagebox ?

[WPF] Dynamic Data Display и Стиль Окна
Я прописал свой стиль окна. Добавил в окно График от D3. Теперь не работает хоткейсы от D3 такие.

Нестандартное окно WPF. Разворачивание на весь экран
Доброго времени суток, форумчане. Начала осваивать технологию WPF. И первым делом при попытке.

Растянуть на весь экран
Всем привет. Создаю небольшую игру-стрелялку. Раньше игры создавал с настройкой расширения экрана и.

87844 / 49110 / 22898

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

Растянуть форму на весь экран
Здравствуйте! Скажите как можно растянуть форму на весь экран. Только поймите меня правильно я не.



Растянуть на весь экран линию hr
Нужно растянуть на весь экран линию hr, поставил свойство position: relative и ширину 100%, а не.

Растянуть svg на весь экран
Привет. Подскажите, пожалуйста, как растянуть svg на весь экран и возможно ли это вообще. Например.

Растянуть видео на весь экран
Как принудительно растянуть videoview на весь экран?

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

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

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

В данном случае в качестве контейнера макета служит элемент StackPanel, но в принципе это может быть и какой-то другой элемент (например, еще один Grid или Canvas для абсолютного позиционирования на основе координат). В этом элементе StackPanel находится кнопка закрытия (со знакомым значком X) и текст:

Окно нестандартной формы использующее элемент Path

Ключевым компонентом в данном примере является элемент Path, который создает фон. Он представляет собой простую векторную фигуру, которая состоит из ряда линий и дуг.

В текущий момент элемент Path имеет фиксированный размер (так же, как и окно), однако его размер несложно сделать изменяемым, поместив элемент в контейнер Viewbox. Еще улучшить этот пример можно, придав кнопке для закрытия окна более убедительный внешний вид — например, с помощью векторного значка X, прорисовываемого на красной поверхности. Хотя для представления кнопки и обработки связанных с ней событий мыши можно было бы воспользоваться и отдельным элементом Path, лучше поступить следующим образом: изменить стандартный элемент управления Button путем применения шаблона и затем сделать элемент Path, прорисовывающий значок X, частью этой измененной кнопки.

Перемещение окон нестандартной формы

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

Итак, для того чтобы позволить пользователю перетаскивать окно необычной формы, которое было показано в предыдущем примере, необходимо просто добавить и обработать для окна (или того элемента в этом окне, который затем будет выполнять ту же роль, что и строка заголовка) событие MouseLeftButtonDown:

Теперь окно будет следовать за курсором мыши по экрану до тех пор, пока пользователь не отпустит кнопку мыши.

Изменение размеров окон нестандартной формы

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

Например, в случае создания окна с эффектом скругленных краев за счет использования объекта Border, такой прием может и сработать. Элемент захвата и изменения размера появится в правом нижнем углу и, в зависимости от того, насколько скругленным был сделан этот угол, разместится в пределах поверхности окна, которому принадлежит. Но в случае создания окна более экзотической формы с применением, например, элемента Path, такой подход точно не сработает — элемент захвата и изменения размера "зависнет" в пустой области рядом с окном.

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

Лучше всего на эту роль подходит элемент Rectangle толщиной в 5 единиц. Ниже приведен пример размещения этого элемента так, чтобы он позволял изменять размер с правой стороны окна со скругленными углами:

В данном случае элемент Rectangle размещается в верхней строке, но для свойства RowSpan получает значение 3. Благодаря этому он растягивается на все три строки и занимает всю правую сторону окна. В свойстве Cursor указывается тот курсор мыши, который должен появляться при наведении мыши на этот элемент. В данном случае это курсор изменения размера "запад-восток" — он имеет знакомую всем форму двухконечной стрелки, которая указывает вправо и влево.

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

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