Как обновить окно wpf c
Перейти к содержимому

Как обновить окно wpf c

  • автор:

Практическое руководство. Обновление страницы

В этом примере показано, как вызвать метод Refresh для обновления текущего содержимого в объекте NavigationWindow.

Пример

Refresh обновляет текущее содержимое в объекте NavigationWindow для перезагрузки из его источника.

void navigateRefreshButton_Click(object sender, RoutedEventArgs e)
Private Sub navigateRefreshButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs) Me.Refresh() End Sub 

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

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

Обновление привязок

В примере из предыдущей статьи (где TextBox.Text привязывается к TextBlock.FontSize) имеется еще один нюанс. При попытке изменить отображаемый размер шрифта, вводя значение в текстовое поле, ничего не происходит. Изменение не применяется до тех пор, пока не будет совершен переход на другой элемент. Это поведение отличается от поведения, которое демонстрировалось в примере с ползунком. Там новый размер шрифта применялся после перетаскивания ползунка в другую позицию, т.е. в переходе на другой элемент вообще не было необходимости.

Чтобы понять это различие, следует повнимательнее присмотреться к выражениям привязки, которые используются этими двумя элементами управления. Когда применяется привязка OneWay или TwoWay, измененное значение распространяется от источника к цели немедленно. В случае с ползунком есть однонаправленное выражение привязки в TextBlock. Таким образом, изменения в свойстве Slider.Value немедленно отражаются в свойстве TextBlock.FontSize. То же поведение имеет место в примере с текстовым полем: изменения в источнике (которым является TextBlock.FontSize) немедленно влияют на цель (TextBox.Text).

Однако изменения, протекающие в обратном направлении — от цели к источнику — не обязательно происходят немедленно. Вместо этого их поведение управляется свойством Binding.UpdateSourceTrigger, которое принимает одно из значений, описанных ниже. Когда текст берется из текстового поля и используется для обновления свойства TextBlock.FontSize, это пример обновления цель-источник, которое использует поведение UpdateSourceTrigger.LostFocus.

PropertyChanged

Источник обновляется немедленно, когда изменяется целевое свойство

LostFocus

Источник обновляется немедленно, когда изменяется целевое свойство и цель теряет фокус

Explicit

Источник не обновляется, пока не будет вызван метод BindingExpression.UpdateSource()

Default

Поведение обновления определяется метаданными целевого свойства (формально — его свойства FrameworkPropertyMetadata.DefaultUpdateSourceTrigger). Для большинства свойств поведением по умолчанию будет PropertyChanged, хотя свойство TextBox.Text обладает поведением по умолчанию LostFocus

Помните, что эти значения не оказывают эффекта на обновление цели. Они просто управляют тем, как обновляется источник в привязках TwoWay и OneWayToSource.

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

Автоматическое обновление привязки

Поведением по умолчанию свойства TextBox.Text является LostFocus просто потому, что текст в текстовом поле будет изменяться непрерывно в процессе пользовательского ввода, вызывая множественные обновления. В зависимости от того, как исходный элемент управления обновляет себя, режим обновления PropertyChanged может сделать приложение более медлительным. Вдобавок это может заставить исходный объект обновлять себя до завершения редактирования, что создаст проблемы при проверке достоверности.

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

Вместо этого код должен будет вручную инициировать обновление. Например, можно было бы добавить кнопку Add (Добавить), которая вызовет метод BindingExpression.UpdateSource(), инициируя немедленное обновление размера шрифта. Разумеется, прежде чем можно будет вызвать метод BindingExpression.UpdateSource(), нужен способ получения объекта BindingExpression. Объект BindingExpression — это тонкая упаковка, которая содержит в себе две вещи: уже известный объект Binding (предоставленный через свойство BindingExpression.ParentBinding) и объект, привязанный от источника (BindingExpression.DataItem).

Вдобавок объект BindingExpression предоставляет два метода для запуска немедленного обновления одной части привязки: UpdateSource() и UpdateTarget().

Для получения объекта BindingExpression используется метод GetBindingExpression(), унаследованный каждым элементом от базового класса FrameworkElement, которому передается целевое свойство, имеющее привязку.

Общие сведения об окнах WPF (WPF .NET)

Пользователи взаимодействуют с приложениями Windows Presentation Foundation (WPF) с помощью окон. Основная цель окна — разместить содержимое, которое визуализирует данные и позволяет пользователям взаимодействовать с ними. Приложения WPF предоставляют собственные окна с помощью класса Window. Эта статья содержит ознакомительные сведения о Window, которые необходимо изучить прежде, чем приступать к созданию окон в приложениях и управлению ими.

В этой статье используется XAML, созданный на основе проекта C#. Если вы используете Visual Basic, XAML может выглядеть немного иначе. Эти различия, как правило, присутствуют в значениях атрибутов x:Class . C# в отличие от Visual Basic включает корневое пространство имен для проекта.

Шаблоны проектов для C# создают тип App , содержащийся в файле app.xaml. В Visual Basic тип имеет имя Application , а файл — Application.xaml .

Класс окна

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

  • Отобразить окно.
  • Настроить размер, положение и внешний вид окна.
  • Разместить содержимое конкретного приложения.
  • Управлять временем существования окна.

На следующем рисунке показаны составные части окна.

Screenshot that shows parts of a WPF window.

Окно разделено на две области: неклиентскую и клиентскую.

Неклиентская область окна реализуется WPF и включает части окна, которые являются общими для большинства окон, в том числе следующие:

  • Заголовок окна (1–5).
  • Значок (1).
  • Заголовок (2).
  • Кнопки «Свернуть» (3), «Развернуть» (4) и «Закрыть» (5).
  • Системное меню (6) с пунктами меню. Появляется по нажатию значка (1).
  • Граница (7).

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

  • Клиентская область (8).
  • Изменение размера захвата (9). Это элемент управления, добавленный в клиентскую область (8).

Реализация окна

Реализация типичного окна включает внешний вид и поведение. Внешний вид определяет, как окно отображается для пользователей, а поведение — функционирование окна при взаимодействии пользователей с ним. В WPF внешний вид и поведение окна можно реализовать с помощью кода или разметки XAML.

Однако обычно внешний вид окна реализуется с помощью разметки XAML, а его поведение — с помощью кода программной части, как показано в следующем примере.

Ниже представлен код программной части для XAML.

using System.Windows; namespace WindowsOverview < public partial class Window1 : Window < public Window1() < InitializeComponent(); >> > 
Public Class Window1 End Class 

Чтобы разрешить совместную работу файла разметки XAML и файла кода программной части, необходимо следующее:

  • В разметке элемент Window должен включать атрибут x:Class . При построении приложения существование атрибута x:Class заставляет Microsoft Build Engine (MSBuild) создавать класс partial , который является производным от Window и имеет имя, указанное в атрибуте x:Class . Для этого требуется добавить объявление пространства имен XAML в схему XAML ( xmlns:x=»http://schemas.microsoft.com/winfx/2006/xaml» ). Созданный класс partial реализует метод InitializeComponent , который вызывается для регистрации событий и установки свойств, реализованных в разметке.
  • В коде программной части класс должен быть классом partial с тем же именем, которое определено атрибутом x:Class в разметке. Кроме того, он должен быть производным от Window. Это позволяет связать файл кода программной части с классом partial , созданным для файла разметки при построении приложения. Дополнительные сведения см. в разделе Компиляция приложения WPF.
  • В коде программной части класс Window должен реализовывать конструктор, который вызывает метод InitializeComponent . Метод InitializeComponent реализуется классом partial , созданным файлом разметки, для регистрации событий и задания свойств, определенных в разметке.

При создании нового класса Window для проекта с помощью Visual Studio классWindow реализуется с использованием разметки и кода программной части, а также включает в себя необходимую конфигурацию для создания связи между файлами разметки и кода программной части, как описано здесь.

При такой конфигурации можно сосредоточиться на определении внешнего вида окна в разметке XAML и реализации его поведения в коде программной части. Ниже представлен пример окна с кнопкой, которая определяет обработчик событий для события Click. Это реализуется в XAML, а обработчик — в коде программной части.

    

Ниже представлен код программной части для XAML.

using System.Windows; namespace WindowsOverview < public partial class Window1 : Window < public Window1() < InitializeComponent(); >private void Button_Click(object sender, RoutedEventArgs e) < MessageBox.Show("Button was clicked."); >> > 
Public Class Window1 Private Sub Button_Click(sender As Object, e As RoutedEventArgs) MessageBox.Show("Button was clicked.") End Sub End Class 

Настройка окна для MSBuild

Реализация окна определяет его конфигурацию для MSBuild. Для окна, которое определяется с помощью разметки XAML и кода программной части:

  • Файлы разметки XAML настраиваются как элементы Page MSBuild.
  • Файлы кода программной части настраиваются как элементы Compile MSBuild.

Проекты пакета SDK для .NET автоматически импортируют правильные элементы Page и Compile , поэтому объявлять эти элементы не нужно. Если проект настроен для WPF, файлы разметки XAML автоматически импортируются как элементы Page , а соответствующий файл кода программной части — как Compile .

Проекты MSBuild не будут автоматически импортировать типы, поэтому объявлять их следует самостоятельно:

Сведения о построении приложений см. в разделе Компиляция приложения WPF.

Время существования окна

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

Открытие окна

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

using System.Windows; namespace WindowsOverview < public partial class App : Application < private void Application_Startup(object sender, StartupEventArgs e) < // Create the window Window1 window = new Window1(); // Open the window window.Show(); >> > 
Class Application Private Sub Application_Startup(sender As Object, e As StartupEventArgs) ' Create the window Dim window As New Window1 ' Open the window window.Show() End Sub End Class 

В этом примере экземпляр Window1 создается при запуске приложения, когда возникает событие Startup. Дополнительные сведения об окне запуска см. в разделе Получение или задание главного окна приложения.

При создании экземпляра окна ссылка на него автоматически добавляется в список окон, находящийся под управлением объекта Application. Первое окно, экземпляр которого создается, Application автоматически устанавливает в качестве главного окна приложения.

Наконец, окно открывается путем вызова метода Show, как показано на следующем изображении:

WPF Window with a single button inside.

Окно, которое открывается путем вызоваShow, является безрежимным, и приложение не запрещает пользователям взаимодействовать с другими окнами в приложении. Метод ShowDialog открывает окно как модальное и запрещает взаимодействие пользователя с конкретным окном. Дополнительные сведения см. в разделе Общие сведения о диалоговых окнах.

При вызове Show перед своим отображением окно выполняет работу по инициализации, чтобы установить инфраструктуру, которая позволяет ему получать данные, вводимые пользователем. После инициализации окна возникает событие SourceInitialized и окно отображается.

Дополнительные сведения см. в разделе Открытие окна или диалогового окна.

Окно запуска

В предыдущем примере событие Startup использовалось для выполнения кода, отображающего начальное окно приложения. Вместо этого используйте команду StartupUri, чтобы указать путь к XAML-файлу в приложении. Приложение автоматически создает и отображает окно, указанное этим свойством.

Владение окном

Окно, открытое путем вызова метода Show, не имеет неявной связи с окном, создавшим его. Пользователи могут взаимодействовать с любым окном независимо от другого. Это означает, что любое из окон может выполнять следующие действия.

  • Перекрывать другое (за исключением случая, когда свойству Topmost одного из окон задано значение true ).
  • Сворачиваться, разворачиваться и восстанавливаться без влияния на другое окно.

Для некоторых окон требуется связь с окном, которое их открывает. Например приложение IDE может открывать окна свойств и окна инструментов, типичное поведение которых заключается в том, чтобы перекрыть окно, которое их создает. Кроме того, такие окна должны всегда закрываться, сворачиваться, разворачиваться и восстанавливаться вместе с окном, которое их создало. Такую связь можно установить, сделав одно окно владельцем другого. Для этого устанавливается свойство Ownerокна во владении со ссылкой на окно-владелец. Это показано в следующем примере.

private void Button_Click(object sender, RoutedEventArgs e) < // Create a window and make the current window its owner var ownedWindow = new ChildWindow1(); ownedWindow.Owner = this; ownedWindow.Show(); >
Private Sub Button_Click(sender As Object, e As RoutedEventArgs) ' Create a window and make the current window its owner Dim ownedWindow As New ChildWindow1 ownedWindow.Owner = Me ownedWindow.Show() End Sub 

После установки владения:

  • Окно во владении может ссылаться на окно-владелец, проверяя значение его свойства Owner.
  • Окно-владелец может найти все принадлежащие ему окна, проверив значение его свойства OwnedWindows.

Активация окна

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

При первом открытии окна события Loaded и ContentRendered запускаются только после запуска события Activated. С учетом этого окно может считаться открытым, если запущено событие ContentRendered.

После активизации окна пользователь может активировать другое окно в том же приложении или активировать другое приложение. В таком случае текущее активное окно становится неактивным и вызывает событие Deactivated. Аналогичным образом, когда пользователь выбирает неактивное окно, оно снова становится активным и запускается событие Activated.

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

Ниже представлен код программной части для XAML.

using System; using System.Windows; namespace WindowsOverview < public partial class CustomMediaPlayerWindow : Window < public CustomMediaPlayerWindow() =>InitializeComponent(); private void Window_Activated(object sender, EventArgs e) < // Continue playing media if window is activated mediaElement.Play(); >private void Window_Deactivated(object sender, EventArgs e) < // Pause playing if media is being played and window is deactivated mediaElement.Pause(); >> > 
Public Class CustomMediaPlayerWindow Private Sub Window_Activated(sender As Object, e As EventArgs) ' Continue playing media if window Is activated mediaElement.Play() End Sub Private Sub Window_Deactivated(sender As Object, e As EventArgs) ' Pause playing if media is being played and window is deactivated mediaElement.Pause() End Sub End Class 

Другие типы приложений могут выполнять код в фоновом режиме, когда окно деактивировано. Например, почтовый клиент может продолжать опрашивать почтовый сервер, пока пользователь работает с другими приложениями. Такие приложения часто обеспечивают другое или дополнительное поведение, когда главное окно не активно. В случае почтовой программы это может означать как добавление нового почтового элемента в папку «Входящие», так и добавление значка уведомления на панель задач. Значок уведомления должен отображаться только в том случае, если окно почты не активно. Это определяется путем проверки свойства IsActive.

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

Активировать область видимости приложения можно с помощью событий Application.Activated и Application.Deactivated.

Предотвращение активации окна

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

Если приложение содержит окно, которое не должно активироваться при отображении, можно задать для его свойства ShowActivated значение false перед первым вызовом метода Show. Результат:

  • Окно не активируется.
  • Событие окна Activated не запускается.
  • Текущее активированное окно останется активным.

Однако окно активируется, если пользователь щелкнет его неклиентскую или клиентскую область. В данном случае:

  • Окно активируется.
  • Событие окна Activated запускается.
  • Ранее активированное окно деактивируется.
  • Затем события окна Deactivated и Activated запускаются в ответ на действия пользователя.

Закрытие окна

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

  • Элемент Закрыть меню Система.
  • Нажатие клавиш ALT+F4 .
  • Нажатие кнопки Закрыть.
  • Нажатие клавиши ESC , если свойство кнопки IsCancel имеет значение true в модальном окне.

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

  • Элемент Выход в меню Файл, обычно для главных окон приложений.
  • Элемент Закрыть в меню Файл, как правило, применим для вторичных окон приложений.
  • Кнопка Отменить, обычно для модального диалогового окна.
  • Кнопка Закрыть, обычно для немодального диалогового окна.

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

Ниже представлен код программной части для XAML.

using System.Windows; namespace WindowsOverview < public partial class ClosingWindow : Window < public ClosingWindow() =>InitializeComponent(); private void fileExitMenuItem_Click(object sender, RoutedEventArgs e) < // Close the current window this.Close(); >> > 
Public Class ClosingWindow Private Sub fileExitMenuItem_Click(sender As Object, e As RoutedEventArgs) ' Close the current window Me.Close() End Sub End Class 

Приложение можно настроить на автоматическое завершение работы при закрытии главного окна приложения (см. MainWindow) или при закрытии последнего окна. Дополнительные сведения см. в разделе ShutdownMode.

Хотя окно может быть непосредственно закрыто с помощью механизмов, предоставляемых в неклиентской и клиентской областях, оно также может быть неявно закрыто в результате поведения в других частях приложения или Windows, включая следующее:

  • Пользователь выходит из системы или завершает работу Windows.
  • Owner окна закрывается.
  • Главное окно приложения закрыто, а ShutdownMode — OnMainWindowClose.
  • Вызывается метод Shutdown.

После закрытия окно нельзя открыть повторно.

Отмена закрытия окна

При закрытии окно запускает два события: Closing и Closed.

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

Ниже представлен код программной части для XAML.

using System.Windows; using System.Windows.Controls; namespace WindowsOverview < public partial class DataWindow : Window < private bool _isDataDirty; public DataWindow() =>InitializeComponent(); private void documentTextBox_TextChanged(object sender, TextChangedEventArgs e) => _isDataDirty = true; private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) < // If data is dirty, prompt user and ask for a response if (_isDataDirty) < var result = MessageBox.Show("Document has changed. Close without saving?", "Question", MessageBoxButton.YesNo); // User doesn't want to close, cancel closure if (result == MessageBoxResult.No) e.Cancel = true; >> > > 
Public Class DataWindow Private _isDataDirty As Boolean Private Sub documentTextBox_TextChanged(sender As Object, e As TextChangedEventArgs) _isDataDirty = True End Sub Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs) ' If data is dirty, prompt user and ask for a response If _isDataDirty Then Dim result = MessageBox.Show("Document has changed. Close without saving?", "Question", MessageBoxButton.YesNo) ' User doesn't want to close, cancel closure If result = MessageBoxResult.No Then e.Cancel = True End If End If End Sub End Class 

В обработчик событий Closing передается событие CancelEventArgs, реализующее свойство Cancel, для которого задается значение true с целью предотвратить закрытие окна.

Если событие Closing не обработано или обработано, но не закрыто, окно закроется. Непосредственно перед фактическим закрытием окна запускается Closed. На этом этапе невозможно предотвратить закрытие окна.

События времени существования окна

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

Diagram that shows events in a window

На рисунке показана последовательность основных событий на протяжении времени существования окна, которое отображается без активации (ShowActivated установлен равным false до отображения окна).

Diagram that shows events in a window

Расположение окна

Когда окно открыто, оно располагается в координатах x и y относительно рабочего стола. Чтобы определить расположение, необходимо проверить свойства Left и Top соответственно. Задайте эти свойства, чтобы изменить расположение окна.

Можно также указать начальное расположение окна Window при первом появлении путем задания свойству WindowStartupLocation одного из следующих значений перечисления WindowStartupLocation:

Если расположение запуска указано как Manual, а свойства Left и Top не заданы, Window запросит у операционной системы расположение для отображения.

Окна верхнего уровня и Z-порядок

Помимо расположения в координатах x и y, окно имеет координату по оси z, которая определяет его вертикальную позицию относительно других окон. Это называется z-порядком окна. Существует два типа: обычный z-порядок и верхний z-порядок. Расположение окна в обычном z-порядке определяется тем, активно оно в данный момент или нет. По умолчанию окно находится в обычном z-порядке. Расположение окна в верхнем z-порядке также определяется тем, активно оно в данный момент или нет. Кроме того, окна в самом верхнем z-порядке всегда расположены над окнами в обычном z-порядке. Окно располагается в самом верхнем z-порядке путем установки для его свойства Topmost значения true .

В каждом z-порядке активное в данный момент окно появляется поверх всех других окон в том же z-порядке.

Размер окна

Помимо расположения на рабочем столе, окно имеет размер, определяемый несколькими свойствами, включая различные свойства ширины и высоты и SizeToContent.

MinWidth, Width и MaxWidth используются для управления диапазоном значений ширины, которые может иметь окно на протяжении своего времени существования.

Так как различные значения ширины и высоты определяют диапазон, ширина и высота изменяемого окна могут находиться в любом месте указанного диапазона для соответствующего измерения. Чтобы определить текущую ширину и высоту, проверьте свойства ActualWidth и ActualHeight соответственно.

Если ширина и высота окна должны соответствовать размеру содержимого, можно использовать свойство SizeToContent, которое имеет следующие значения:

  • SizeToContent.Manual.
    Нет эффекта (по умолчанию).
  • SizeToContent.Width.
    Соответствие ширине содержимого. Дает такой же эффект, как задание свойствам MinWidth и MaxWidth значения ширины содержимого.
  • SizeToContent.Height.
    Соответствие высоте содержимого. Дает такой же эффект, как задание свойствам MinHeight и MaxHeight значения высоты содержимого.
  • SizeToContent.WidthAndHeight.
    Соответствие ширине и высоте содержимого. Дает такой же эффект, как задание свойствам MinHeight и MaxHeight значения высоты содержимого, а свойствам MinWidth и MaxWidth — ширины.

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

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

// Manually alter window height and width this.SizeToContent = SizeToContent.Manual; // Automatically resize width relative to content this.SizeToContent = SizeToContent.Width; // Automatically resize height relative to content this.SizeToContent = SizeToContent.Height; // Automatically resize height and width relative to content this.SizeToContent = SizeToContent.WidthAndHeight; 
' Manually alter window height and width Me.SizeToContent = SizeToContent.Manual ' Automatically resize width relative to content Me.SizeToContent = SizeToContent.Width ' Automatically resize height relative to content Me.SizeToContent = SizeToContent.Height ' Automatically resize height and width relative to content Me.SizeToContent = SizeToContent.WidthAndHeight 

Порядок приоритета для свойств размера

Различные свойства размеров окна объединяются для определения диапазона ширины и высоты окна изменяемого размера. Чтобы не выходить за рамки допустимого диапазона, Window оценивает значения свойств размера с использованием следующего порядка приоритета.

Для свойств высоты:

  1. FrameworkElement.MinHeight
  2. FrameworkElement.MaxHeight
  3. SizeToContent.Height / SizeToContent.WidthAndHeight
  4. FrameworkElement.Height

Для свойств ширины:

  1. FrameworkElement.MinWidth
  2. FrameworkElement.MaxWidth
  3. SizeToContent.Width / SizeToContent.WidthAndHeight
  4. FrameworkElement.Width

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

Window state

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

Окно со свернутым состоянием сворачивается в кнопку на панели задач, если для параметра ShowInTaskbar установлено значение true . В противном случае оно сворачивается до минимально возможного размера и перемещается в нижний левый угол рабочего стола. Ни один из типов свернутого окна не может быть изменен с помощью границы или захвата для изменения размера, хотя свернутое окно, которое не отображается на панели задач, можно перетаскивать на рабочем столе.

Окно с развернутым состоянием разворачивается до максимально возможного размера, который не может превышать значения свойств MaxWidth, MaxHeight и SizeToContent. Как и для свернутого окна, размер развернутого окна нельзя изменить с помощью захвата для изменения размера или перетаскивания границы.

Значения свойств окна Top, Left, Width и Height всегда представляют значения для обычного состояния, даже если окно в текущий момент развернуто или свернуто.

Состояние окна можно настроить путем задания его свойства WindowState, которое может иметь одно из следующих значений перечисления WindowState:

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

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

Внешний вид окна

Можно изменить внешний вид клиентской области окна, добавляя в нее определенное содержимое, такое как кнопки, метки и текстовые поля. Для настройки неклиентской области Window предоставляет несколько свойств, в том числе Icon для задания значка окна и Title для задания его заголовка.

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

Режим изменения размера

Свойство WindowStyle позволяет разрешать или запрещать пользователям изменять размер окна, а также контролировать данный процесс. Стиль окна влияет на следующее:

  • разрешение или запрет изменения размера путем перетаскивания границы окна с помощью мыши;
  • отображение кнопок Свернуть, Развернуть и Закрыть в неклиентской области;
  • включение кнопок Свернуть, Развернуть и Закрыть.

Изменение размера окна можно настроить путем задания его свойства ResizeMode, которое может иметь одно из следующих значений перечисления ResizeMode:

  • NoResize
  • CanMinimize
  • CanResize (по умолчанию)
  • CanResizeWithGrip

Как и в случае WindowStyle, режим изменения размера окна редко изменяется на протяжении времени существования. Это означает, что, скорее всего, он устанавливается из разметки XAML.

Обратите внимание, что определить, развернуто, свернуто или восстановлено окно, можно путем проверки свойства WindowState.

Window style

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

Для управления типом границы окна его свойству WindowStyle задается одно из следующих значений перечисления WindowStyle:

  • None
  • SingleBorderWindow (по умолчанию)
  • ThreeDBorderWindow
  • ToolWindow

Эффект применения стиля окна показан на следующем рисунке:

Screenshot that shows how WindowStyle affects a window in WPF.

Обратите внимание, что на изображении выше отсутствуют заметные различия между SingleBorderWindow и ThreeDBorderWindow . В Windows XP стиль ThreeDBorderWindow влиял на внешний вид окна, добавляя трехмерную границу в клиентскую область. Начиная с Windows 7 различия между двумя стилями минимальны.

Задать WindowStyle можно с помощью разметки XAML или кода. Поскольку он вряд ли изменится на протяжении времени существования окна, вы, скорее всего, настроите его с помощью разметки XAML.

Непрямоугольный стиль окна

В некоторых ситуациях стилей границы, которые предлагает WindowStyle, недостаточно. Например, можно создать приложение с непрямоугольной границей, такой, как используется проигрывателем мультимедиа Microsoft Windows.

Рассмотрим окно «облачко с текстом», показанное на следующем изображении.

Screenshot of a WPF window that has a clipped area and custom shape.

Окно такого типа можно создать путем задания свойству WindowStyle значения None, а также использования поддержки прозрачности, предоставляемой Window.

         " Foreground="Red" Content="❌" FontSize="15" />     

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

Наличие панели задач

Внешний вид окна по умолчанию включает кнопку панели задач. У некоторых типов окон нет кнопки панели задач. К таким окнам относятся, например, окна сообщений, диалоговые окна или окна, у которых для свойства WindowStyle задано значение ToolWindow. Можно управлять отображением кнопки панели задач для окна, задав свойство ShowInTaskbar ( true по умолчанию).

Другие типы окон

NavigationWindow — это окно, предназначенное для размещения перемещаемого содержимого.

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

См. также

  • Общие сведения о диалоговых окнах
  • Открытие окна или диалогового окна
  • Открытие общего диалогового окна
  • Открытие окна сообщения
  • Закрытие окна или диалогового окна
  • System.Windows.Window
  • System.Windows.MessageBox
  • System.Windows.Navigation.NavigationWindow
  • System.Windows.Application

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

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

Как обновить окно wpf c

Доброго времени суток всем.

Не могу найти рефреш окна в WPF.

у меня есть приблизительно следующий код в событии Window_Loaded:

loadingTbl.Visibility = Visibility.Visible; // Refresh while (!TryConnect()) < loadingTbl.Visibility = Visibility.Hidden; // Refresh Forms.SettingsForm sf = new Neon.Monitor.Admin.Forms.SettingsForm(); bool? result = sf.ShowDialog(); if (result.HasValue && !result.Value) break; loadingTbl.Visibility = Visibility.Visible; // Refresh > loadingTbl.Visibility = Visibility.Hidden; // Refresh

Хотелось бы на каждое изменение свойства loadingTbl.Visibility перерисовывать окно (loadingTbl это TextBlock), чтобы текст блок становился
видимым.

Мало этого, после вызова диалогового окна (sf.ShowDialog()), оно также не прячется (видимо также из-за отсутствия рефреша основного окна).

Буду признателен любой помощи!

Re: Рефреш окон в WPF

От: Qbit86 https://twitter.com/qbit86
Дата: 17.11.08 10:06
Оценка:

AJI>Не могу найти рефреш окна в WPF.

WPF тут ни при чём.

AJI>loadingTbl.Visibility = Visibility.Visible; AJI>// Refresh AJI>while (!TryConnect()) AJI> < AJI>loadingTbl.Visibility = Visibility.Hidden; AJI> // Refresh AJI> Forms.SettingsForm sf = AJI> new Neon.Monitor.Admin.Forms.SettingsForm(); AJI> bool? result = sf.ShowDialog(); AJI> if (result.HasValue && !result.Value) // Может, проблема здесь? AJI> break; AJI> loadingTbl.Visibility = Visibility.Visible; AJI> // Refresh AJI>> AJI>loadingTbl.Visibility = Visibility.Hidden; AJI>// Refresh

AJI>Хотелось бы на каждое изменение свойства loadingTbl.Visibility перерисовывать окно (loadingTbl это TextBlock), чтобы текст блок становился
AJI>видимым.

AJI>Мало этого, после вызова диалогового окна (sf.ShowDialog()), оно также не прячется (видимо также из-за отсутствия рефреша основного окна).

С рефрешем всё нормально. Только в твоём цикле контрол становится видимым лишь на миг, в начале следующей итерации он опять спрятан. Окно диалога у тебя прячется, но опять моментально появляется на следующей итерации.

Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Рефреш окон в WPF

От: AJIXuMuK
Дата: 17.11.08 11:24
Оценка:

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

Q>С рефрешем всё нормально. Только в твоём цикле контрол становится видимым лишь на миг, в начале следующей итерации он опять спрятан. Окно диалога у тебя прячется, но опять моментально появляется на следующей итерации.

Смею не согласиться по поводу мгновенной перерисовки в цикле, т.к. проверка коннекта (TryConnect) занимает несколько секунд, т.е. между
действиями цикла на самом деле существует задержка.

Диалоговое окно перерисовывается не заново, а сохраняется отрисовка с нажатием на кнопку и потерей фокуса.

Мало этого, я к сожалению так и не увидел, как делать рефреш

Re: Рефреш окон в WPF

От: wisdom
Дата: 17.11.08 11:29
Оценка: +1

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

AJI>Не могу найти рефреш окна в WPF.

AJI>

AJI>while (!TryConnect()) AJI>

Конектиться (по сети) к чему-то в UI-потоке. Ну не знаю.

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

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