Перейти к содержимому

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

  • автор:

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

У клиента при изменении размеров главного окна wpf наблюдается неприятное мерцание фона. Данная проблема не воспроизводится в наших условиях, узнать точные условия у клиента (ОС и прочее) нет возможности. Можно ли запретить перерисовку окна до завершения изменения размера этого окна? Например, пока зажата кнопка мыши — отрисовывать рамку будущего окна, а само окно перерисовывать только после отпускания кнопки мыши.
Смутно припоминаю, что в winforms такая возможность была, но не могу вспомнить ключевых слов

Re: WPF Изменение размеров окна

От: Noen
Дата: 15.06.11 05:25
Оценка:

Здравствуйте, ProPirks, Вы писали:

PP>У клиента при изменении размеров главного окна wpf наблюдается неприятное мерцание фона. Данная проблема не воспроизводится в наших условиях, узнать точные условия у клиента (ОС и прочее) нет возможности. Можно ли запретить перерисовку окна до завершения изменения размера этого окна? Например, пока зажата кнопка мыши — отрисовывать рамку будущего окна, а само окно перерисовывать только после отпускания кнопки мыши.
PP>Смутно припоминаю, что в winforms такая возможность была, но не могу вспомнить ключевых слов

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

Re: WPF Изменение размеров окна

От: Glas
Дата: 15.06.11 16:31
Оценка:

Здравствуйте, ProPirks, Вы писали:

PP>Например, пока зажата кнопка мыши — отрисовывать рамку будущего окна, а само окно перерисовывать только после отпускания кнопки мыши.

Сами же и ответили на вопрос. В событие SizeChanged добавить проверку нажата ли кнопка мыши через Mouse.LeftButton.

Окна

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

Класс Window привносит ряд свойств, которые позволяют настроить окно приложения:

  • AllowsTransparency : при значении true позволяет установить прозрачный фон окна
  • Icon : представляет иконку, которая отображается в левом верхнем углу окна и в панели задач. Если иконка не установлена, то система будет использовать стандартную иконку по умолчанию.
  • Top : устанавливает отступ окна приложения от верхней границы экрана
  • Left : устанавливает отступ окна приложения от левой границы экрана
  • ResizeMode : задает режим изменения размеров окна. Может принимать следующие значения:
    • CanMinimize : окно можно только свернуть
    • NoResize : у окна нельзя изменить начальные размеры
    • CanResize : у окна можно изменять размеры
    • CanResizeWithGrip : в правом нижнем углу окна появляется визуализация того, что у окна можно изменять размеры
    • Width : автоматически масштабируется только ширина
    • Height : автоматически масштабируется только высота
    • WidthAndHeight : автоматически масштабируются высота и ширина
    • Manual : автоматическое масштабирование отсутствует
    • CenterOwner : если данное окно было запущено другим окном, то данное окно позиционируется относительно центра запустившего его окна
    • CenterScreen : окно помещается в центре экрана
    • Manual : позиция устанавливается вручную с помощью свойств Top и Left
    • Maximized : раскрыто на весь экран
    • Minimized : свернуто
    • Normal : стандартное состояние

    Жизненный цикл

    В процессе работы окно в WPF проходит ряд этапов жизненного цикла, которые доступны нам через обработку событий класса Window:

    Жизненный цикл окна приложения в WPF

    1. Initialized : это событие возникает при инициализации окна, когда у него устанавливаются все свойства, но до применения к нему стилей и привязки данных. Это общее событие для всех элементов управления в WPF, поэтому следует учитывать, что сначала возникают события вложенных элементов, а затем их контейнеров. То есть событие Initialized окна приложения генерируется только после того, как отработает событие Initialized для всех вложенных элементов.
    2. Loaded : возникает после полной инициализации окна и применения к нему стилей и привязки данных. После генерации этого события происходит визуализация элемента, и окно отображается на экране и становится видимым для пользователя
    3. Closing : возникает при закрытии окна
    4. Closed : возникает, когда окно становится закрытым
    5. Unloaded : возникает после закрытия окна при выгрузке всех связанных ресурсов из памяти

    Соответственно, если нам надо выполнить некоторые действия при загрузке или при закрытии окна, мы можем обработать события Loaded и Closing/Closed. Например, запишем в текстовый лог события жизненного цикла:

    using System; using System.Windows; using System.Windows.Media; using System.IO; namespace WindowApp < public partial class MainWindow : Window < string path = "log.txt"; public MainWindow() < InitializeComponent(); this.Loaded += MainWindow_Loaded; this.Closing += MainWindow_Closing; this.Closed += MainWindow_Closed; >private void MainWindow_Loaded(object sender, RoutedEventArgs e) < Log("Loaded"); >private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e) < Log("Closing"); >private void MainWindow_Closed(object sender, EventArgs e) < Log("Closed"); >private void Log(string eventName) < using (StreamWriter logger = new StreamWriter(path, true)) < logger.WriteLine(DateTime.Now.ToLongTimeString() + " - " + eventName); >> > >

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

    Параметры изменения размеров элемента управления DataGrid

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

    Изменение размера элемента управления DataGrid

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

    По умолчанию для свойств Height и Width объекта DataGrid устанавливается значение Double.NaN (» Auto » в XAML), и размер DataGrid изменяется в соответствии с содержимым.

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

    При привязке к набору данных, если свойство Height объекта DataGrid не ограничено, этот объект продолжит добавлять строки для каждого элемента данных в наборе данных привязки. Это может привести к выходу элемента управления DataGrid за видимые границы приложения по мере добавления строк. В этом случае полосы прокрутки в DataGrid отображаться не будут, так как свойство Height продолжит увеличиваться, чтобы вместить новые строки.

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

    Чтобы избежать этих проблем при работе с большими наборами данных, рекомендуется явным образом задать свойство Height объекта DataGrid или поместить этот объект в контейнер, который будет ограничивать его свойство Height, например, Grid. Если свойство Height ограничено, в DataGrid будут создаваться только строки, которые помещаются в элемент управления с заданным свойством Height, и для отображения новых данных эти строки будут перезаписываться.

    Установка размера элемента управления DataGrid

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

    Свойство Description
    Height Задает указанную высоту для элемента управления DataGrid.
    MaxHeight Задает верхнюю границу для высоты элемента управления DataGrid. Элемент управления DataGrid будет увеличиваться по вертикали, пока не достигнет этой высоты.
    MinHeight Задает нижнюю границу для высоты элемента управления DataGrid. Элемент управления DataGrid будет уменьшаться по вертикали, пока не достигнет этой высоты.
    Width Задает указанную ширину для элемента управления DataGrid.
    MaxWidth Задает верхнюю границу для ширины элемента управления DataGrid. Элемент управления DataGrid будет увеличиваться по горизонтали, пока не достигнет этой ширины.
    MinWidth Задает нижнюю границу для ширины элемента управления DataGrid. Элемент управления DataGrid будет уменьшаться по горизонтали, пока не достигнет этой ширины.

    Изменение размера строк и заголовков строк

    Строки элемента управления DataGrid

    По умолчанию для свойства Height объекта DataGrid строки устанавливается значение Double.NaN (» Auto » в XAML), и высота строки будет увеличиваться в соответствии с содержимым. Чтобы указать высоту всех строк в DataGrid, задайте свойство DataGrid.RowHeight. Пользователи могут изменить высоту строки, перетащив разделители заголовков строк.

    Заголовки строк элемента управления DataGrid

    Чтобы отобразить заголовки строк, задайте значение DataGridHeadersVisibility.Row или DataGridHeadersVisibility.All для свойства HeadersVisibility. По умолчанию заголовки строк отображаются и автоматически масштабируются в соответствии с содержимым. Чтобы задать фиксированную ширину для заголовков строк, установите свойство DataGrid.RowHeaderWidth.

    Изменение размера столбцов и заголовков столбцов

    Столбцы элемента управления DataGrid

    Элемент управления DataGrid использует значения DataGridLength и структуру DataGridLengthUnitType, чтобы задать фиксированный размер или автоматическое изменение размера.

    В следующей таблице приведены значения, предоставляемые структурой DataGridLengthUnitType.

    Имя Описание
    Auto В режиме автоматического изменения размера по умолчанию размер столбцов DataGrid задается на основе содержимого ячеек и заголовков столбцов.
    SizeToCells В режиме автоматического изменения размера на основе ячеек размер столбцов DataGrid задается на основе содержимого ячеек в столбцах, без включения заголовков столбцов.
    SizeToHeader В режиме автоматического изменения размера на основе заголовков размер столбцов DataGrid задается на основе только заголовков столбцов.
    Pixel В режиме изменения размера на основе пикселей размер столбцов DataGrid задается на основе указанного числового значения.
    Star Режим звезды используется для распределения доступного размера по взвешенным пропорциям.

    Класс DataGridLengthConverter может использоваться для преобразования данных между числовыми или строковыми значениями и значениями DataGridLength.

    По умолчанию для свойства DataGrid.ColumnWidth устанавливается значение SizeToHeader, а для свойства DataGridColumn.Width устанавливается значение Auto. В режиме изменения размера Auto или SizeToCells ширина столбца будет увеличиваться до максимальной ширины отображаемого содержимого. При прокрутке в этих режимах изменения размера столбцы будут расширяться, если в область окна попадает содержимое, размер которого превышает текущую ширину столбца. После исчезновения содержимого из области окна столбец не будет сжиматься.

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

    Свойство Description
    DataGrid.MaxColumnWidth Задает верхнюю границу для всех столбцов в элементе управления DataGrid.
    DataGridColumn.MaxWidth Задает верхнюю границу для отдельного столбца. Переопределяет DataGrid.MaxColumnWidth.
    DataGrid.MinColumnWidth Задает нижнюю границу для всех столбцов в элементе управления DataGrid.
    DataGridColumn.MinWidth Задает нижнюю границу для отдельного столбца. Переопределяет DataGrid.MinColumnWidth.
    DataGrid.ColumnWidth Задает указанную ширину для всех столбцов в элементе управления DataGrid.
    DataGridColumn.Width Задает указанную ширину для отдельного столбца. Переопределяет DataGrid.ColumnWidth.

    Заголовки столбцов элемента управления DataGrid

    По умолчанию в элементе управления DataGrid отображаются заголовки столбцов. Чтобы скрыть заголовки столбцов, задайте значение DataGridHeadersVisibility.Row или DataGridHeadersVisibility.None для свойства HeadersVisibility. По умолчанию когда заголовки строк отображаются, они автоматически масштабируются в соответствии с содержимым. Чтобы задать фиксированную высоту для заголовков столбцов, установите свойство DataGrid.ColumnHeaderHeight.

    Изменение размера с помощью мыши

    Пользователи могут изменять размер строк и столбцов DataGrid, перетаскивая разделители заголовков строк или столбцов. Элемент управления DataGrid также поддерживает автоматическое изменение размера строк и столбцов путем двойного щелчка по разделителю заголовка строки или столбца. Чтобы запретить пользователю изменять размер определенных столбцов, задайте для свойства DataGridColumn.CanUserResize значение false для конкретных столбцов. Чтобы запретить пользователям изменять размер всех столбцов, задайте для свойства DataGrid.CanUserResizeColumns значение false . Чтобы запретить пользователям изменять размер всех строк, задайте для свойства DataGrid.CanUserResizeRows значение false .

    См. также

    • DataGrid
    • DataGridColumn
    • DataGridLength
    • DataGridLengthConverter

    Совместная работа с нами на GitHub

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

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

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