TOC

This article has been localized into Russian by the community.

Диалоговые окна:

OpenFileDialog

Всякий раз, когда Вы открываете/закрываете файл в любом приложении Windows, Вы сталкиваетесь примерно с одинаковыми диалоговыми окнами. Причиной этого, конечно же является то, что эти окна являются частью Windows API, а, следовательно, доступны разработчикам на платформе WIndows.

Для WPF вы можете найти стандартные диалоговые окна как для сохранения, так и для открытия файлов в пространстве имен Microsoft.Win32. В этой статье мы рассмотрим класс OpenFileDialog, который позволяет легко отображать окно для открытия одного/нескольких файлов.

Простой пример использования OpenFileDialog

Давайте начнем использование OpenFileDialog без дополнительных опций, с помощью TextBox:

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFile_Click">Open file</Button>
        </WrapPanel>
        <TextBox Name="txtEditor" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogSample : Window
	{
		public OpenFileDialogSample()
		{
			InitializeComponent();
		}

		private void btnOpenFile_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			if(openFileDialog.ShowDialog() == true)
				txtEditor.Text = File.ReadAllText(openFileDialog.FileName);
		}
	}
}

При нажатии на кнопку Open, отображается окно OpenFileDialog. В зависимости от Вашей версии Windows, Вы увидите нечто подобное:

Метод ShowDialog() возвращает логическое nullable значение (может быть true, false либо null). Если пользователь выберет файл и нажмет "Open" результатом будет True, и в этом случае мы попытаемся загрузить файл в элемент TextBox. Мы получили полный путь к выбранному файлу с помощью свойства FileName в OpenFileDialog.

Фильтрация

Обычно, при выборе файла, пользователь желает ограничить выбор одним или несколькими типами файлов. Например, Word в основном открывает файлы Word (с расширением .doc или .docx), а Блокнот - текстовые файлы (.txt).

Вы можете определить фильтр для диалоговоко окна OpenFileDialog с возможностью выбора ипользователем типов файлов и ограничения файлов, для большей наглядности. Это осуществляется с помощью свойства Filter, которое мы добавим к предыдущему примеру (после инициализации окна):

openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";

Вот результат:

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

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

Подводя итог, следующий код означает, что мы присваиваем типу название "Text files (*.txt)" (расширение в скобках - это знак внимания пользователю, он будет знать, какие типы включены в "Text files"), а вторая часть определяет, что будут показаны файлы с расширением .txt:

Text files (*.txt)|*.txt

Конечно же, каждый создаваемый тип может иметь множество расширений. Например, изображения могут быть определены как для JPEG, так и для PNG файлов, вот так:

openFileDialog.Filter = "Image files (*.png;*.jpeg)|*.png;*.jpeg|All files (*.*)|*.*";

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

Определение каталога по умолчанию

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

openFileDialog.InitialDirectory = @"c:\temp\";

Если вдруг Вы захотите использовать только одну папку в Windows (Рабочий стол, Мои документы или Program Files), имейте ввиду, этот путь может отличаться, в зависиости от версии Windows,либо в зависимости от того, какой "пользователь" вошел в систему. Фреймворк .NET может Вам помощь в этом, просто используйте класс Environment и его составляющие для работы со специальными каталогами:

openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

В этом случае, я использовал путь к папке "Мои Документы", но обратите внимание на перечисление SpecialFolder - оно содержит множество интересных путей. Если хотите изучить полный список SpecialFolder, воспользуйтесь этой статьей MSDN.

Несколько файлов

Если Ваше приложение должно поддерживать открытие нескольких файлов или Вы просто хотите понять, как использовать OpenFileDialog для одновременного открытия нескольких файлов, просто включите свойство Multiselect. В следующем примере, мы это с успехом проделали, и, наш дорогой Читатель, собрали в одном все механизмы, рассмотренные в текущей главе (фильтрация, определение каталога по умолчанию):

<Window x:Class="WpfTutorialSamples.Dialogs.OpenFileDialogMultipleFilesSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="OpenFileDialogMultipleFilesSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnOpenFile" Click="btnOpenFiles_Click">Open files</Button>
        </WrapPanel>
        <ListBox Name="lbFiles" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

namespace WpfTutorialSamples.Dialogs
{
	public partial class OpenFileDialogMultipleFilesSample : Window
	{
		public OpenFileDialogMultipleFilesSample()
		{
			InitializeComponent();
		}

		private void btnOpenFiles_Click(object sender, RoutedEventArgs e)
		{
			OpenFileDialog openFileDialog = new OpenFileDialog();
			openFileDialog.Multiselect = true;
			openFileDialog.Filter = "Text files (*.txt)|*.txt|All files (*.*)|*.*";
			openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
			if(openFileDialog.ShowDialog() == true)
			{
				foreach(string filename in openFileDialog.FileNames)
					lbFiles.Items.Add(Path.GetFileName(filename));
			}
		}
	}
}

Если Вы протестируете этот код, то заметите, что выбирать несколько файлов в одном каталоге становится возможным путем удерживания Ctrl или Shift и нажатием мыши. Выбрав их механизм в этом примере просто добавит файлы в элемент ListBox, в цикле по свойству FileNames.

В итоге

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

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!