Wpf окно выбора файла
Windows Presentation Foundation (WPF) позволяет разрабатывать собственные диалоговые окна. Диалоговые окна — это окна, в которых реализовано определенное намерение и пользовательский интерфейс. В этой статье объясняется, как работает диалоговое окно, а также какие типы диалоговых окон можно создавать и использовать. Диалоговые окна используются для выполнения следующих задач:
- отображения определенных сведений для пользователей;
- сбора сведений от пользователей;
- сбора и отображения сведений.
- отображения запроса операционной системы, например окна печати;
- выбора файла или папки.
Окна таких типов называются диалоговыми окнами. Диалоговое окно может отображаться двумя способами: как модальное и как немодальное.
При отображении модального диалогового окна для пользователя приложение прерывает работу до тех пор, пока пользователь не закроет диалоговое окно. Обычно в этом окне отображается запрос или оповещение. С другими окнами в приложении нельзя взаимодействовать, пока диалоговое окно не будет закрыто. После закрытия модального диалогового окна приложение продолжает работу. Чаще всего используются диалоговые окна с запросами на открытие или сохранение файла, диалоговые окна принтера и диалоговые окна, уведомляющие пользователя об определенном состоянии.
Если открыто немодальное диалоговое окно, пользователь может активировать и другие окна. Например, если пользователь хочет найти вхождения конкретного слова в документе, в главном окне часто открывается диалоговое окно с запросом слова для поиска. Так как приложению не требуется запрещать пользователю редактировать документ, диалоговое окно не обязательно должно быть модальным. В немодальном диалоговом окне должна быть как минимум кнопка Закрыть, чтобы можно было закрыть его. Для выполнения определенных функций могут предоставляться другие кнопки, такие как кнопка Найти далее, позволяющее найти следующее слово при поиске слов.
Определение каталога по умолчанию
Первоначальный каталог используемый классом OpenFileDialog уже определен в Windows, но используя свойство InitialDirectory, его можно переопределить. Обычно, Вы будете определять это значение специально для пользователя, всего приложения или, возможно, как каталог, который был использован с последний раз. Вы можете его определить как путь в формате строки, вот так:
В этом случае, я использовал путь к папке "Мои Документы", но обратите внимание на перечисление SpecialFolder - оно содержит множество интересных путей. Если хотите изучить полный список SpecialFolder, воспользуйтесь этой статьей MSDN.
Multiple files
If your application supports multiple open files, or you simply want to use the OpenFileDialog to select more than one file at a time, you need to enable the Multiselect property. In the next example, we've done just that, and as a courtesy to you, dear reader, we've also applied all the techniques mentioned above, including filtering and setting the initial directory:
If you test this code, you will see that you can now select multiple files in the same directory, by holding down either Ctrl orShift and clicking with the mouse. Once accepted, this example simply adds the filenames to the ListBox control, by looping through the FileNames property.
Open File dialog box
The open file dialog box is used by file opening functionality to retrieve the name of a file to open.
The common open file dialog box is implemented as the OpenFileDialog class and is located in the Microsoft.Win32 namespace. The following code shows how to create, configure, and show one, and how to process the result.
For more information on the open file dialog box, see Microsoft.Win32.OpenFileDialog.
Немодальное диалоговое окно
Чтобы отобразить немодальное диалоговое окно, вызовите Show(). В диалоговом окне должна быть как минимум кнопка Закрыть. Можно предоставить другие кнопки и интерактивные элементы для выполнения определенной функции, например кнопку Найти следующее, чтобы найти следующее слово при выполнении поиска слов.
Так как немодальное диалоговое окно не блокирует работу вызывающего кода, необходимо обеспечить другой способ возврата результата. Выполните одно из следующих действий:
- предоставление в окне свойства объекта данных;
- обработка события Window.Closed в вызывающем коде;
- создание в окне событий, которые возникают, когда пользователь выбирает объект или нажимает определенную кнопку.
This article demonstrates how you can display a common system dialog box in Windows Presentation Foundation (WPF). Windows implements different kinds of reusable dialog boxes that are common to all applications, including dialog boxes for selecting files and printing.
Since these dialog boxes are provided by the operating system, they're shared among all the applications that run on the operating system. These dialog boxes provide a consistent user experience, and are known as common dialog boxes. As a user uses a common dialog box in one application, they don't need to learn how to use that dialog box in other applications.
A message box is another common dialog box. For more information, see How to open a message box.
Диалоговое окно открытия файлов
Диалоговое окно открытия файлов, показанное на следующем рисунке, используется функциональностью открытия файла для получения имени открываемого файла.
Общее диалоговое окно открытия файла реализуется как класс OpenFileDialog и находится в пространстве имен Microsoft.Win32. Следующий код показывает, как создавать, настраивать и отображать такое окно, а также как обрабатывать результат.
Дополнительные сведения о диалоговом окне открытия файла см. в статье Microsoft.Win32.OpenFileDialog.
OpenFileDialog может использоваться для безопасного извлечения имен файлов приложениями, выполняющимися с частичным доверием (см. раздел Безопасность).
Создание модального пользовательского диалогового окна
В этом разделе показано, как с помощью класса Window создать типовое модальное диалоговое окно, используя в качестве примера диалоговое окно Margins (см. пример диалогового окна). Диалоговое окно Margins показано на следующем рисунке.
Настройка модального диалогового окна
Пользовательский интерфейс для типичного диалогового окна включает следующее.
Различные элементы управления, которые необходимы для сбора нужных данных.
Кнопка ОК, которую пользователи нажимают для закрытия диалогового окна, возврата в функцию и продолжения обработки.
Кнопка Отмена, которую пользователи нажимают для закрытия диалогового окна и прекращения дальнейшей работы функции.
Кнопка Закрыть в заголовке окна.
Кнопки Свернуть, Развернуть и Восстановить.
Меню Система, чтобы сворачивать, разворачивать, восстанавливать и закрывать диалоговое окно.
Положение выше и в центре окна, которое открывает диалоговое окно.
Возможность изменения размера, где это возможно, чтобы диалоговое окно не было слишком маленьким, и пользователь мог установить полезный размер по умолчанию. Для этого необходимо задать как значения по умолчанию, так и минимальные размеры.
Кнопку ESC следует настроить как сочетание клавиш, которое вызывает нажатие кнопки Отмена. Это делается установкой свойства IsCancel кнопки Отмена в значение true .
Кнопка ENTER (или RETURN) следует настроить как сочетание клавиш, которое вызывает нажатие кнопки ОК. Это делается установкой свойства IsDefault кнопки OK в значение true .
Следующий код демонстрирует такую конфигурацию.
Пользовательский интерфейс для диалогового окна также распространяется в строку меню окна, открывающего диалоговое окно. Если пункт меню вызывает функцию, которая перед продолжением выполнения требует взаимодействия с пользователем посредством диалогового окна, то в названии этого пункта меню будет многоточие в заголовке, как показано ниже.
Если пункт меню вызывает функцию, которая отображает диалоговое окно, не требующее взаимодействия с пользователем, например диалоговое окно "О программе", многоточие не требуется.
Открытие модального диалогового окна
Диалоговое окно обычно отображается в результате выбора пользователем пункта меню для выполнения доменной функции, такой как установка полей документа в текстовом процессоре. Отображение диалогового окна похоже на отображение обычного окна, хотя требуется дополнительная настройка для диалогового окна. Весь процесс создания, настройки и открытия диалогового окна показан в следующем коде.
Здесь код передает в диалоговое окно сведения по умолчанию (о текущих полях). Кроме того, в коде устанавливается свойство Window.Owner со ссылкой на окно, в котором отображается диалоговое окно. Как правило, всегда следует устанавливать владельца диалогового окна, чтобы задать общее для всех диалоговых окон поведение, связанное с состоянием окна (дополнительные сведения см. в разделе Общие сведения об окнах WPF).
Необходимо задать владельца для поддержки автоматизации пользовательского интерфейса (UI) в диалоговых окнах (см. раздел Обзор автоматизации пользовательского интерфейса).
После настройки диалогового окна оно отображается как модальное путем вызова метода ShowDialog.
Проверка пользовательских данных
Если открывается диалоговое окно и пользователь предоставляет требуемые данные, диалоговое окно отвечает за проверку допустимости предоставленных данных по следующим причинам.
С точки зрения безопасности следует проверять все входные данные.
С точки зрения конкретного домена проверка данных предотвращает обработку в коде ошибочных данных, которые могут вызывать исключения.
С точки зрения взаимодействия с пользователем диалоговое окно может помочь пользователям, показывая, какие введенные ими данные являются недопустимыми.
С точки зрения производительности проверка данных в многоуровневом приложении может уменьшить количество циклов обработки между уровнями клиента и приложения, особенно в том случае, если в приложение входят веб-службы или серверные базы данных.
Чтобы проверить связанный элемент управления в WPF, необходимо определить правило проверки и связать его с привязкой. Правило проверки — это пользовательский класс, производный от ValidationRule. В следующем примере показано правило проверки MarginValidationRule , которое проверяет, имеет ли привязанное значение тип Double, и находится ли оно в пределах указанного диапазона.
В этом коде логика проверки правила проверки реализована путем переопределения метода Validate, который проверяет данные и возвращает соответствующее значение ValidationResult.
Чтобы сопоставить это правило проверки со связанным элементом управления, используется следующая разметка.
После сопоставления правила проверки WPF будет автоматически применять его при вводе данных в связанный элемент управления. Если элемент управления содержит недопустимые данные, WPF отображает красные границы вокруг недопустимого элемента, как показано на следующем рисунке.
WPF не препятствует выходу пользователя из недопустимого элемента управления до ввода правильных данных. Это правильное поведение диалогового окна; пользователь должен иметь возможность свободно перемещаться по элементам управления в диалоговом окне, независимо от того, правильны ли введенные данные. Однако это означает, что пользователь может ввести недопустимые данные и нажать кнопку ОК. По этой причине код также должен проверить все элементы управления в диалоговом окне после нажатия кнопки ОК путем обработки события Click.
Этот код перечисляет все объекты зависимости в окне, и если какие-либо объекты недопустимы (согласно возвращенному значению GetHasError), недопустимый элемент управления получает фокус, метод IsValid возвращает значение false , и окно считается недопустимым.
Если диалоговое окно является допустимым, оно может быть безопасно закрыто и выполнен возврат. В рамках процесса возврата необходимо возвращать результат в вызывающую функцию.
Установка результата модального диалогового окна
Открытие диалогового окна с помощью ShowDialog принципиально похоже на вызов метода: код, открывший диалоговое окно с помощью ShowDialog, ожидает возврата ShowDialog. При возврате ShowDialog код, который его вызвал, должен решить, продолжить или прекратить обработку, на основе того, какую кнопку нажал пользователь, OK или Отмена. Для облегчения принятия этого решения диалоговое окно должно возвращать выбор пользователя как значение Boolean, возвращенное методом ShowDialog.
При нажатии кнопки OKShowDialog должен возвращать true . Это можно сделать путем установки свойства DialogResult диалогового окна, когда нажимается кнопка OK.
Обратите внимание, что установка этого свойства DialogResult также приводит к автоматическому закрытию окна, что не требует явного вызова Close.
При нажатии кнопки ОтменаShowDialog должен возвращать false , что также требует установку свойства DialogResult.
Если свойство IsCancel кнопки установить в значение true , и пользователь нажимает либо кнопку Отмена или кнопку ESC, параметр DialogResult автоматически устанавливается в значение false . Следующая разметка действует так же, как предыдущий код, без необходимости обработки события Click.
Диалоговое окно автоматически возвращает значение false , когда пользователь нажимает кнопку Закрыть в заголовке или выбирает пункт меню Закрыть в меню Система.
Обработка данных, возвращенных из модального диалогового окна
Если в диалоговом окне установлено DialogResult, функция, открывшая его, может получить результат диалогового окна, проверив свойство DialogResult, возвращаемое методом ShowDialog.
Если результатом диалогового окна является значение true , функция использует его в качестве подсказки для получения и обработки данных, предоставленных пользователем.
После возврата ShowDialog повторно открыто диалоговое окно невозможно. Вместо этого придется создать новый экземпляр.
Если результатом диалогового окна является значение false , функция должна соответствующим образом завершить обработку.
Модальные диалоговые окна
Если диалоговое окно отображается путем вызова ShowDialog(), код, с помощью которого было открыто диалоговое окно, ожидает возврата метода ShowDialog . При возврате метода код, вызывающий его, должен определить, следует ли продолжать обработку. Как правило, пользователь указывает это, нажав кнопку ОК или Отмена в диалоговом окне.
При нажатии кнопки ОК метод ShowDialog должен возвращать значение true , а при нажатии кнопки Отмена должно возвращаться значение false . Чтобы реализовать такое поведение, задается свойство DialogResult при нажатии кнопки.
Свойство DialogResult можно задать, только если диалоговое окно отображалось с использованиемShowDialog(). Если задано свойство DialogResult , диалоговое окно закрывается.
Если для свойства кнопки IsCancel задано значение true и окно открыто с использованием ShowDialog(), при нажатии клавиши ESC окно закроется и для DialogResult будет установлено значение false .
Обработка ответа
ShowDialog() возвращает логическое значение, определяющее поведение пользователя: подтверждение запроса, отображаемого в диалоговом окне, или его отмена. Если вы оповещаете пользователя о чем-то, но от него не требуется принятие решения или предоставление данных, вы можете игнорировать ответ. Кроме того, ответ также можно проверить, просмотрев свойство DialogResult. В следующем коде показано, как обработать ответ:
Простой пример использования OpenFileDialog
Давайте начнем использование OpenFileDialog без дополнительных опций, с помощью TextBox:
При нажатии на кнопку Open, отображается окно OpenFileDialog. В зависимости от Вашей версии Windows, Вы увидите нечто подобное:
Метод ShowDialog() возвращает логическое nullable значение (может быть true, false либо null). Если пользователь выберет файл и нажмет "Open" результатом будет True, и в этом случае мы попытаемся загрузить файл в элемент TextBox. Мы получили полный путь к выбранному файлу с помощью свойства FileName в OpenFileDialog.
Print dialog box
The print dialog box is used by printing functionality to choose and configure the printer that a user wants to print data to.
The common print dialog box is implemented as the PrintDialog class, and is located in the System.Windows.Controls namespace. The following code shows how to create, configure, and show one.
For more information on the print dialog box, see System.Windows.Controls.PrintDialog. For detailed discussion of printing in WPF, see Printing overview.
Автономные приложения обычно имеют главное окно, отображающее основные данные, с которыми приложение работает, и предоставляющее функциональные возможности для обработки этих данных с помощью механизмов пользовательского интерфейса (UI), таких как строки меню, панели инструментов и строки состояния. Нетривиальное приложение может также отображать дополнительные окна для следующих целей:
отображения определенных сведений для пользователей;
сбора сведений от пользователей;
сбора и отображения сведений.
Такие типы окон называются диалоговыми окнами, и они бывают двух типов: модальные и немодальные.
Модальное диалоговое окно отображается функцией, когда для продолжения ей требуются дополнительные данные от пользователя. Поскольку функция зависит от модального диалогового окна для сбора данных, это окно также не разрешает пользователю активизировать другие окна в приложении, пока остается открытым. В большинстве случаев модальное диалоговое окно разрешает пользователю сообщать о завершении работы с модальным диалоговым окном путем нажатия кнопки ОК или Отмена. Нажатие кнопки ОК указывает, что пользователь ввел данные и желает, чтобы функция продолжила работу с этими данными. Нажатие кнопки Отмена указывает, что пользователь хочет вообще остановить выполнение этой функции. Наиболее распространенными примерами модальных диалоговых окон являются окна, которые отображаются для открытия, сохранения и печати данных.
С другой стороны, немодальное диалоговое окно не запрещает пользователю активацию других окон, когда оно открыто. Например, если пользователь хочет найти вхождения конкретного слова в документе, главное окно часто открывает диалоговое окно с запросом слова для поиска. Так как поиск слова не мешает пользователю редактировать документ, диалоговое окно не обязательно должно быть модальным. Немодальное диалоговое окно содержит по крайней мере одну кнопку Закрыть для закрытия этого диалогового окна и может предоставлять дополнительные кнопки для выполнения определенных функций, например кнопку Найти далее для поиска следующего слова, соответствующего критерию поиска.
Хотя класс MessageBox может предоставлять простой пользовательский интерфейс диалогового окна, преимущество использования MessageBox заключается в том, что это единственный тип окна, который может отображать приложения, работающие в песочнице с частичным доверием (см. раздел Безопасность), такие как браузерные приложения XAML (XBAPs).
Возврат результата
Открытие другого окна (особенно модального) — отличный способ возврата сведений о состоянии и другой информации в ответ на вызывающий код.
Пользовательские диалоговые окна
Хотя общие диалоговые окна полезны и должны использоваться, когда это возможно, они не поддерживают требований диалоговых окон отдельного домена. В этих случаях необходимо создавать собственные диалоговые окна. Как мы увидим, диалоговое окно является окном со специальным поведением. В Window реализованы эти типы поведения. Поэтому с помощью класса Window можно создавать модальные и немодальные диалоговые окна.
Общие диалоговые окна
Windows реализует различные, многократно используемые диалоговые окна, которые являются общими для всех приложений, включая диалоговые окна для открытия файлов, сохранения файлов и печати. Поскольку эти диалоговые окна реализованы операционной системой, они могут совместно использоваться всеми приложениями, работающими в операционной системе, что помогает поддерживать единообразие пользовательского интерфейса; если пользователи знакомы с диалоговым окном, предоставляемым операционной системой в одном приложении, им не нужно учиться пользоваться этим диалоговым окном в других приложениях. Поскольку эти диалоговые окна доступны для всех приложений и обеспечивают согласованный пользовательский интерфейс, они называются общими диалоговыми окнами.
Windows Presentation Foundation (WPF) инкапсулирует общие диалоговые окна открытия файлов, сохранения файлов и печати и представляет их как управляемые классы для использования в автономных приложениях. В этом разделе приводится краткий обзор каждого типа диалоговых окон.
Общие диалоговые окна
В Windows реализованы различные типы многократно используемых диалоговых окон, которые являются общими для всех приложений, включая диалоговые окна для выбора файлов и печати.
Так как эти диалоговые окна предоставляются операционной системой, их совместно используют все работающие в ней приложения. Эти диалоговые окна обеспечивают согласованное взаимодействие с пользователем и называются общими диалоговыми окнами. Так как пользователь использует общее диалоговое окно в одном приложении, ему не нужно учиться использовать это диалоговое окно в других приложениях.
WPF инкапсулирует общие диалоговые окна открытия файлов, сохранения файлов и печати и представляет их как управляемые классы для использования в автономных приложениях.
Дополнительные сведения об общих диалоговых окнах см. в следующих статьях:
Setting the initial directory
The initial directory used by the OpenFileDialog is decided by Windows, but by using the InitialDirectory property, you can override it. You will usually set this value to a user specified directory, the application directory or perhaps just to the directory last used. You can set it to a path in a string format, like this:
In this case, I get the path for the My Documents folder, but have a look at the SpecialFolder enumeration - it contains values for a lot of interesting paths. For a full list, please see this MSDN article.
Пункты меню
Пункты меню — это распространенный способ предоставить пользователям возможность работы с действиями приложения, сгруппированными по связанным темам. Вероятно, вы видели меню Файл во многих приложениях. В обычном приложении пункт меню Файл позволяет сохранить, загрузить и распечатать файл. Если после действия будет отображаться модальное окно, заголовок обычно содержит многоточие, как показано на следующем изображении:
В двух пунктах меню есть многоточие: . . Это указывает пользователю, что при выборе этих пунктов меню отображается модальное окно, приостанавливающее работу приложения до тех пор, пока пользователь не закроет его.
Такой метод разработки — это простой способ сообщить пользователю, какого поведения следует ожидать.
В итоге
Наверняка Вы обратили внимание на то, что использование OpenFileDialog в WPF является очень простым, к тому же, данный механизм делает большую часть работы за Вас. Но заметьте, что в данном примере, для экономии места в коде, я не посвятил ни одной строки обработке исключений. При работе с файлами, и в целом при работе с входом-выходом, Вам всегда следует опасаться исключений, так как они легко могут появиться при работе с заблокированным файлом, несуществующим путем или другими.
Is your preferred language not on the list? Click here to help us translate this article into your language!
диалоговое окно сохранения файлов
Диалоговое окно сохранения файлов, показанное на следующем рисунке, используется функциональностью сохранения файла для получения имени сохраняемого файла.
Общее диалоговое окно сохранения файла реализуется как класс SaveFileDialog и находится в пространстве имен Microsoft.Win32. Следующий код показывает, как создавать, настраивать и отображать такое окно, а также как обрабатывать результат.
Дополнительные сведения о диалоговом окне сохранения файла см. в статье Microsoft.Win32.SaveFileDialog.
Фильтрование
Обычно, при выборе файла, пользователь желает ограничить выбор одним или несколькими типами файлов. Например, Word в основном открывает файлы Word (с расширением .doc или .docx), а Блокнот - текстовые файлы (.txt).
Вы можете определить фильтр для диалоговоко окна OpenFileDialog с возможностью выбора ипользователем типов файлов и ограничения файлов, для большей наглядности. Это осуществляется с помощью свойства Filter, которое мы добавим к предыдущему примеру (после инициализации окна):
Заметьте, что теперь окно имеет выпадающий список с возможными для выбора типами файлов, все файлы отображаются в соответствии с выбранным расширением.
На первый взгляд, формат определения фильтра может показаться слегка странным, но в нем представлена удобочитаемая версия для пользователя и другая, для компьютера, который будет в состоянии их "прочитать" и разделить с помощью символа-сепаратора "|". Если Вы хотите определить больше чем один тип (как было в примере), просто добавьте необходимые Вам, с помощью выше введенного сепаратора.
Подводя итог, следующий код означает, что мы присваиваем типу название "Text files (*.txt)" (расширение в скобках - это знак внимания пользователю, он будет знать, какие типы включены в "Text files"), а вторая часть определяет, что будут показаны файлы с расширением .txt:
Конечно же, каждый создаваемый тип может иметь множество расширений. Например, изображения могут быть определены как для JPEG, так и для PNG файлов, вот так:
Просто отделите каждое расширение точкой с запятой во второй части (той, которая для компьютера), а в первой можете отформатировать текст как Вам будет угодно, но, большинство разработчиков пользуются одной и той же нотацией для двух частей, как на примере выше.
Пользовательские диалоговые окна
Хотя общие диалоговые окна полезны и должны использоваться, когда это возможно, они не соответствуют требованиям к предметно-ориентированным диалоговым окнам. В этих случаях необходимо создавать собственные диалоговые окна. Как мы увидим, диалоговое окно является окном со специальным поведением. В Window реализованы эти типы поведения. С помощью класса Window вы можете создавать модальные и немодальные диалоговые окна.
Если вы создаете собственное диалоговое окно, нужно учитывать множество рекомендаций по разработке. Хотя между окном приложения и диалоговым окном есть сходство, например они совместно используют один базовый класс, диалоговое окно используется только для определенной цели. Обычно диалоговое окно требуется, когда нужно запросить у пользователя определенную информацию или ответ. Как правило, приложение приостанавливает работу во время отображения диалогового окна (модального) с ограничением доступа к остальной части приложения. После закрытия диалогового окна приложение продолжает работу. Но ограничение взаимодействия только диалоговым окном не является обязательным.
После закрытия окна WPF открыть его повторно нельзя. Настраиваемые диалоговые окна — это окна WPF. К ним применяются те же правила. Чтобы узнать, как закрыть окно, см. статью Как закрыть окно или диалоговое окно.
Simple OpenFileDialog example
Let's start off by using the OpenFileDialog without any extra options, to load a file to a TextBox control:
Once you click the Open file button, the OpenFileDialog will be instantiated and shown. Depending on which version of Windows you're using and the theme selected, it will look something like this:
The ShowDialog() will return a nullable boolean value, meaning that it can be either false, true or null. If the user selects a file and presses "Open", the result is True, and in that case, we try to load the file into the TextBox control. We get the complete path of the selected file by using the FileName property of the OpenFileDialog.
Несколько файлов
Если Ваше приложение должно поддерживать открытие нескольких файлов или Вы просто хотите понять, как использовать OpenFileDialog для одновременного открытия нескольких файлов, просто включите свойство Multiselect. В следующем примере, мы это с успехом проделали, и, наш дорогой Читатель, собрали в одном все механизмы, рассмотренные в текущей главе (фильтрация, определение каталога по умолчанию):
Если Вы протестируете этот код, то заметите, что выбирать несколько файлов в одном каталоге становится возможным путем удерживания Ctrl или Shift и нажатием мыши. Выбрав их механизм в этом примере просто добавит файлы в элемент ListBox, в цикле по свойству FileNames.
Кнопки
Вы можете следовать принципу, который описан в разделе Пункты меню. Используйте многоточие в тексте кнопки, чтобы указать пользователю, что при ее нажатии появится модальное диалоговое окно. На следующем изображении есть две кнопки, и легко понять, при нажатии какой кнопки отображается диалоговое окно:
Реализация диалогового окна
При разработке диалогового окна следуйте приведенным ниже рекомендациям, чтобы обеспечить оптимальное взаимодействие с пользователем:
❌ НЕ СЛЕДУЕТ загромождать диалоговое окно. Интерфейс диалогового окно предназначен для ввода определенных данных или выбора.
✔️ СЛЕДУЕТ реализовать кнопку ОК, позволяющую закрыть окно.
✔️ СЛЕДУЕТ задать для свойства IsDefault кнопки ОК значение true , чтобы пользователь мог нажать клавишу ВВОД для подтверждения и закрытия окна.
✔ РЕКОМЕНДУЕТСЯ добавить кнопку Отмена, чтобы пользователь смог закрыть окно и указать, что он не хочет продолжать взаимодействие с ним.
✔️ СЛЕДУЕТ задать для свойства IsCancel кнопки Отмена значение true , чтобы пользователь мог нажать клавишу ESC для закрытия окна.
✔️ СЛЕДУЕТ задать заголовок окна, чтобы точно указать, что представляет диалоговое окно или что должен делать с ним пользователь.
✔ СЛЕДУЕТ задать минимальные значения ширины и высоты для окна, чтобы пользователь не сделал размер окна слишком маленьким.
✔ РЕКОМЕНДУЕТСЯ отключить возможность изменения размера окна, если для ShowInTaskbar задано значение false . Изменение размера можно отключить, задав для параметра ResizeMode значение NoResize.
Следующий код демонстрирует такую конфигурацию.
Приведенный выше код XAML позволяет создать примерно такое окно:
Элементы пользовательского интерфейса для открытия диалогового окна
Пользовательский интерфейс для диалогового окна также распространяется на строку меню или кнопку окна, открывающую его. Если пункт меню или кнопка вызывает функцию, которая требует взаимодействия с пользователем через диалоговое окно, прежде чем функция сможет продолжить работу, в конце текста заголовка элемента управления следует использовать многоточие:
Если пункт меню или кнопка вызывает функцию, которая отображает диалоговое окно, не требующее взаимодействия с пользователем, например диалоговое окно О программе, многоточие не требуется.
Создание немодального пользовательского диалогового окна
Немодальное диалоговое окно, например диалоговое окно поиска, показанное на следующем рисунке, в основном имеет такой же внешний вид, как и модальное диалоговое окно.
Однако поведение несколько отличается, как показано в следующих разделах.
Открытие немодального диалогового окна
Немодальное диалоговое окно открывается вызовом метода Show.
В отличие от ShowDialog, Show возвращается немедленно. Следовательно, вызывающее окно не может определить, когда немодальное диалоговое окно закрывается, и поэтому не знает, когда следует проверить результат диалогового окна или получить данные из диалогового окна для дальнейшей обработки. Поэтому диалоговому окну необходимо создать альтернативный способ возврата данных в вызывающее окно для обработки.
Обработка данных, возвращенных из немодального диалогового окна
В этом примере FindDialogBox может возвращать в главное окно один или несколько результатов поиска, в зависимости от искомого текста, без какой-либо определенной частоты. Как и в случае с модальным диалоговым окном, немодальное диалоговое окно может возвращать результаты с помощью свойств. Однако окну, которому принадлежит данное диалоговое окно, нужно знать, когда следует проверять эти свойства. Один из способов сделать это — реализовать для диалогового окна событие, которое возникает всякий раз, когда текст найден. FindDialogBox реализует для этой цели событие TextFoundEvent , для чего сначала требуется делегат.
Используя делегат TextFoundEventHandler , FindDialogBox реализует TextFoundEvent .
В результате Find может вызывать событие, когда найден результат поиска.
Затем окну-владельцу нужно зарегистрировать и обработать это событие.
Закрытие немодального диалогового окна
Поскольку не требуется устанавливать свойство DialogResult, немодальное диалоговое окно можно закрыть с помощью предоставляемых системой механизмов, в том числе следующих.
Нажатие кнопки Закрыть в заголовке окна.
Нажатие клавиш ALT+F4.
Выбор команды Закрыть в меню Система.
Кроме того, ваш код может вызыватьClose при нажатии кнопки Закрыть.
Whenever you open or save a file in almost any Windows application, you will see roughly the same dialogs for doing that. The reason is of course that these dialogs are a part of the Windows API and therefore also accessible to developers on the Windows platform.
For WPF, you will find standard dialogs for both opening and saving files in the Microsoft.Win32 namespace. In this article we'll focus on the OpenFileDialog class, which makes it very easy to display a dialog for opening one or several files.
Filter
Normally when you want your user to open a file in your application, you want to limit it to one or a couple of file types. For instance, Word mostly opens Word file (with the extension .doc or .docx) and Notepad mostly open text files (with the extension .txt).
You can specify a filter for your OpenFileDialog to indicate to the user which types of file they should be opening in your application, as well as limiting the files shown for a better overview. This is done with the Filter property, which we can add to the above example, right after initializing the dialog, like this:
Here's the result:
Notice how the dialog now has a combo box for selecting the file types, and that the files shown are limited to ones with the extension(s) specified by the selected file type.
The format for specifying the filter might look a bit strange at first sight, but it works by specifying a human-readable version of the desired file extension(s) and then one for the computer to easily parse, separated with a pipe (|) character. If you want more than one file type, as we do in the above example, each set of information are also separated with a pipe character.
So to sum up, the following part means that we want the file type to be named "Text files (*.txt)" (the extension in the parenthesis is a courtesy to the user, so they know which extension(s) are included) and the second part tells the dialog to show files with a .txt extension:
Each file type can of course have multiple extensions. For instance, image files could be specified as both JPEG and PNG files, like this:
Simply separate each extension with a semicolon in the second part (the one for the computer) - in the first part, you can format it the way you want to, but most developers seem to use the same notation for both parts, as seen in the example above.
Save File dialog box
The save file dialog box is used by file saving functionality to retrieve the name of a file to save.
The common save file dialog box is implemented as the SaveFileDialog class, and is located in the Microsoft.Win32 namespace. The following code shows how to create, configure, and show one, and how to process the result.
For more information on the save file dialog box, see Microsoft.Win32.SaveFileDialog.
Печать - диалоговое окно
Диалоговое окно печати, показанное на следующем рисунке, используется функциональными возможностями печати для выбора и настройки принтера, на котором пользователь хочет печатать данные.
Общее диалоговое окно печати реализуется как класс PrintDialog и находится в пространстве имен System.Windows.Controls. Следующий код показывает, как создавать, настраивать и отображать такое окно.
Дополнительные сведения о диалоговом окне печати см. в статье System.Windows.Controls.PrintDialog. Подробное описание печати в WPF см. в разделе Общие сведения о печати.
Summary
As you can see, using the OpenFileDialog in WPF is very easy and really takes care of a lot of work for you. Please be aware that to reduce the amount of code lines, no exception handling is done in these examples. When working with files and doing IO tasks in general, you should always look out for exceptions, as they can easily occur due to a locked file, non-existing path or related problems.
Is your preferred language not on the list? Click here to help us translate this article into your language!
Всякий раз, когда Вы открываете/закрываете файл в любом приложении Windows, Вы сталкиваетесь примерно с одинаковыми диалоговыми окнами. Причиной этого, конечно же является то, что эти окна являются частью Windows API, а, следовательно, доступны разработчикам на платформе Windows.
Для WPF вы можете найти стандартные диалоговые окна как для сохранения, так и для открытия файлов в пространстве имен Microsoft.Win32. В этой статье мы рассмотрим класс OpenFileDialog, который позволяет легко отображать окно для открытия одного/нескольких файлов.
Читайте также: