Как запретить изменять размер окна wpf
Перейти к содержимому

Как запретить изменять размер окна wpf

  • автор:

Запрет изменения ширины окна

Имеется окно.
Необходимо запретить изменять его размеры, а именно — запретить изменять ширину.

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

Есть ли способ более гуманный?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Изменить Margin окна(из кода C#) после изменения размера окна
Есть окно у которого задано свойство Margin = "0" Необходимо при изменении размера окна на.

Изменение ширины окна влево
Всем привет) Мне необходимо сделать так, чтобы при наведении форма меняла размер, но не вправо.

ListView c автоизменением ширины колонок при увеличении размеров окна
Доброго времени суток. В моем приложении на стороне сервера есть ListView который занимает весь.

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

TheGreatCornholio
1252 / 730 / 285
Регистрация: 30.07.2015
Сообщений: 2,407

Лучший ответ

Сообщение было отмечено bodynar как решение

Решение

ЦитатаСообщение от bodynar Посмотреть сообщение

Есть ли способ более гуманный?

Добавлено через 2 минуты
Чет проглядел, для WPF — MaxHeight, MaxWidth, MinHeight, MinWidth.

WPF компоновка (запрет на изменение размера фрэймов)

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

Отслеживать
задан 7 фев 2021 в 10:44
Виктор Хорошилов Виктор Хорошилов
11 1 1 бронзовый знак
Фреймы плохо. А размеры — задайте ячейке грида строгие размеры да и все.
7 фев 2021 в 11:26

Какое свойство отвечает за блокировку изменения размера определенного фрэйма при изменении размеров окна? — высота и ширина, задайте явно, и размер не будет меняться. Но то что вы спрашиваете, звучит очень странно. Располагать элементы надо в XAML, а для их группировки использовать панели ( Grid , StackPanel , WrapPanel , . ). А для отображения коллекций ListBox , ItemsControl , ListView , DataGrid , и т.д, привязыаясь к данным через ItemsSource=»» .

7 фев 2021 в 11:58

Нужно, чтобы при изменении размеров приложения, один фрэйм с его содержимым никак не изменялся, а другие меняли свой размер по мере изменения размера приложения, разметка используется — Grid, область разделена на фрэймы

7 фев 2021 в 16:28

Вы умеете Grid разбивать на строки и колонки? RowDefinitions и ColumnDefonitions если нет, то научитесь, это суперпросто. Для строк и колонок можно задавать высоту и ширину, в долях, пикселях и по ширине контента.

Класс Window

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

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

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

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

AllowsTransparency

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

Icon

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

В последних версиях ОС Windows (Windows Vista и Windows 7) добавлен новый стандарт для значков 48×48 и 256×256 пикселей, размер которых можно изменять. Если свойство 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 (визуализируется очень тонкая приподнятая граница без области для строки заголовка). Увидеть разницу можно на рисунке ниже:

Запретить изменение размеров окна

Приветствую, ребята. Столкнулся с такой «фичей». Есть окно с параметрами AllowsTransparency=»True», стиль WindowStyle=»None». Если его перемещать за границы экрана слева, справа и снизу, то размер не меняется, а вот если переместить за верхнюю границу, то его размер обрезается. Я так понял это такая «фича» Windows. Можно ли как-то отключить такое «удобство», т.е. необходимо при перемещении окна за границы экрана сверху, чтобы не менялся его размер ?

Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Плавное изменение размеров окна. Как это реализуется?
Всем привет. Я тут столкнулся с проблемой касательно wpf. Заключается она вот в чем. Есть окно у.

Изменение размеров, координат линий при изменении размера окна
Дело состоит в том, что я рисую график с помощью Line в Canvas по точкам. Точек ооочень много (пару.

Calendar изменение размеров
Здравствуйте! Подскажите пожалуйста как изменить размер компонента Calendar. Пробовал свойства.

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

Почтальон, а как вы его перемешаете?
У него же нет рамки.

Покажите полностью XAML для примера.

управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

Покажите полностью XAML для примера.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 x:Class="ImageOverlay.View.SliderWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:ImageOverlay.View" mc:Ignorable="d" WindowStyle="None" AllowsTransparency="True" ResizeMode="CanResizeWithGrip" Height="400" Width="400" ShowInTaskbar="False" Topmost="True" Opacity="" MouseLeftButtonDown="Window_MouseLeftButtonDown" WindowStartupLocation="CenterScreen"> >  Margin="5" Source="" Stretch="Fill" RenderTransformOrigin="0.5,0.5"> >  Angle=""/> > > > >

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

а как вы его перемешаете?

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

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

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

Добавлено через 38 секунд

ЦитатаСообщение от Почтальон Посмотреть сообщение

Перемещаю с помощью обработчика MouseLeftButtonDown, т.е. с зажатой левой мышью.
CB окна тоже скиньте.
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

CB окна тоже скиньте.
Там все просто:

1 2 3 4 5 6 7 8 9 10 11 12
public partial class SliderWindow : Window { public SliderWindow() { InitializeComponent(); } private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { this.DragMove(); } }

Добавлено через 40 секунд

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

проверить смогу только во второй половине дня
Мне не к спеху

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

ЦитатаСообщение от Почтальон Посмотреть сообщение

Если мышь отпустить, когда окно за верхней границей экрана, то оно изменяется в размерах.

У меня другое поведение на вашем коде.
Если увести за верхнюю границу, то после отпускания мыши, окно отпрыгивает назад не меня размера.
И так ведут себя все окна — не только ваше.

управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

Если увести за верхнюю границу, то после отпускания мыши, окно отпрыгивает назад не меня размера.
И так ведут себя все окна — не только ваше.

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

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

При явном задании положения окна удаётся его перенести за верхнюю границу.
Ни каких изменений размера у меня не проявлялось.
Только при прилипании к краям экрана мог измениться размер.

7 8 9 10 11
mc:Ignorable="d" Top="-200" Left="-10" WindowStyle="None" AllowsTransparency="True" ResizeMode="CanResizeWithGrip" Height="400" Width="400" ShowInTaskbar="False" Topmost="True" Opacity="" MouseLeftButtonDown="Window_MouseLeftButtonDown" WindowStartupLocation="CenterScreen" >

Добавлено через 34 секунды

ЦитатаСообщение от Почтальон Посмотреть сообщение

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

Добавлено через 7 минут

ЦитатаСообщение от Почтальон Посмотреть сообщение

Ее нужно отключать.

Прилипание отключил.
Окно действительно стало менять размер.
Если делать размер по контенту, то оно размер не меняет, но «выпрыгивает» из под края.

7 8 9 10 11 12 13 14 15 16 17 18
mc:Ignorable="d" WindowStyle="None" AllowsTransparency="True" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False" Topmost="True" Opacity="" MouseLeftButtonDown="Window_MouseLeftButtonDown" WindowStartupLocation="CenterScreen" SizeToContent="WidthAndHeight">  Height="400" Width="400" >  Margin="5" Stretch="Fill" RenderTransformOrigin="0.5,0.5" Source="Resources/Плюс.png"> >  Angle=""/> > > > >

управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

«выпрыгивает» из под края
А как запретить это безобразие ?

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2
Почтальон, изменение окна возникает ещё до получения окном события PreviewMouseLeftButtonUp

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
mc:Ignorable="d" MouseLeftButtonUp="Window_MouseLeftButtonUp" WindowStyle="None" AllowsTransparency="True" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False" Topmost="True" Opacity="" MouseLeftButtonDown="Window_MouseLeftButtonDown" WindowStartupLocation="CenterScreen" Height="400" Width="400" PreviewMouseLeftButtonUp="window_PreviewMouseLeftButtonUp"> >  Margin="5" Stretch="Fill" RenderTransformOrigin="0.5,0.5" Source="Resources/Плюс.png"> >  Angle=""/> > >  VerticalAlignment="Bottom" HorizontalAlignment="Left" FontSize="30" Text=">>"/>  VerticalAlignment="Bottom" HorizontalAlignment="Center" FontSize="30" Text=">>"/> > >

То есть это функция системы и «изнутри окна» её не отрегулируешь.
В настройках тоже ничего не нашёл.
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

изменение окна возникает ещё до получения окном события PreviewMouseLeftButtonUp
Я так понимаю это связано с «особенностями» windows

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

ЦитатаСообщение от Почтальон Посмотреть сообщение

А как запретить это безобразие ?

Плохо ещё, что изменение позиции происходит ДО изменения размера.
Поэтому пока не получается отловить сам момент «отпрыгивания».
Запоминать позицию не проблема.
Но как определить в какой момент её меняет система, а не пользователь — не могу найти.
И какого-то «хитрого» алгоритма в голову тоже не приходит.

Добавлено через 1 минуту

ЦитатаСообщение от Почтальон Посмотреть сообщение

Я так понимаю это связано с «особенностями» windows

Да. Системе это делает ещё ДО уведомления окна об этом.
Не могу найти ещё события возникающего при окончании дропа.

Добавлено через 16 минут
Почтальон, хотел отловить момент «выскакивания» окна

1 2 3 4 5 6 7 8 9
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { if (e.Property == TopProperty) ; /// Точка останова else if (e.Property == HeightProperty) ; /// Точка останова base.OnPropertyChanged(e); }

НИ ФИГА!
Когда точки останова стоят — происходит перетаскивание по несколько пикселей.
Зависит от скорости дёргания мыши.
Но за несколько «рывков» удалось окно пости полностью засунуть под верхнюю рамку без изменения размеров.

То есть это какая-то высокоуровневая функция винды или, вообще, баг какой-то.

управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

То есть это какая-то высокоуровневая функция винды или, вообще, баг какой-то.
Ну это скорее не баг, а фича

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

ЦитатаСообщение от Почтальон Посмотреть сообщение

Ну это скорее не баг, а фича

Ну, да. любимый ответ MS.

Надо в OnPropertyChanged(DependencyPropertyChangedEventArgs e) по старому и нову значению определять, что это параметры «выскакивания».
Запоминать старую позицию экрана.

А в событии MouseLeftButtonUp проверять размеры экрана.
Если изменились, то восстанавливать их и позицию запомненную в OnPropertyChanged .

Пока другого ничего в голову не пришло.

управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5

ЦитатаСообщение от Элд Хасп Посмотреть сообщение

Пока другого ничего в голову не пришло.
как бы тут зацикливания не произошло

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

ЦитатаСообщение от Почтальон Посмотреть сообщение

как бы тут зацикливания не произошло

Не должно.
Восстановление размеров будет только в методе обработчике MouseLeftButtonUp .
А после него позиция окна пользователем меняться уже не может.

управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
Элд Хасп, спасибо, попробую реализовать.

Эксперт .NET

15234 / 10352 / 2721
Регистрация: 21.04.2018
Сообщений: 30,666
Записей в блоге: 2

Лучший ответ

Сообщение было отмечено Почтальон как решение

Решение

ЦитатаСообщение от Почтальон Посмотреть сообщение

попробую реализовать.
Вот вариант

7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
mc:Ignorable="d" WindowStyle="None" AllowsTransparency="True" ResizeMode="CanResizeWithGrip" ShowInTaskbar="False" Topmost="True" Opacity="" Height="400" Width="400" > >  Margin="5" Stretch="Fill" RenderTransformOrigin="0.5,0.5" Source="Resources/Плюс.png"> >  Angle=""/> > >  VerticalAlignment="Bottom" HorizontalAlignment="Left" FontSize="30"  Text=">>"/>  VerticalAlignment="Bottom" HorizontalAlignment="Center" FontSize="30" Text=">>"/> > >
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); MouseLeftButtonDown += Window_MouseLeftButtonDown; MouseLeftButtonUp += Window_MouseLeftButtonUp; } private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { flagHeight = flagTop = false; this.DragMove(); } private void Window_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { if (flagTop && flagHeight) { Top = topOld; Height = heightOld; } flagHeight = flagTop = false; } private double topOld; private double heightOld; private bool flagTop; private bool flagHeight; protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { base.OnPropertyChanged(e); if (e.Property == TopProperty) { topOld = (double)e.OldValue; double topNew = (double)e.NewValue; flagTop = topOld  0 && topNew  0 && topOld  topNew; } else if (e.Property == HeightProperty) { heightOld = (double) e.OldValue; double heightNew = (double)e.NewValue; flagHeight = heightNew  heightOld; } } }

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *