На Universal Windows Platform для работы с файлами мы можем использовать специальные диалоговые окна. В каких ситуациях они могут быть нам полезны? Прежде всего когда речь идет об открытии или сохранении файла, и нам нужен простой и понятный визуальный компонент для выбора места файла на устройстве.
Для сохранения файла применяется компонент Windows.Storage.Pickers.FileSavePicker, а для открытия файла .
Для работы с файловыми диалогами определим следующую разметку XAML:
<Page x:Class="FoldersApp.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:FoldersApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d"> <Page.BottomAppBar> <CommandBar> <AppBarButton x:Name="saveButton" Label="Сохранить" Icon="Save" Click="saveButton_Click" /> <AppBarButton x:Name="openButton" Label="Открыть" Icon="OpenFile" Click="openButton_Click" /> </CommandBar> </Page.BottomAppBar> <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <TextBox x:Name="myTextBox" VerticalAlignment="Stretch" TextWrapping="Wrap" /> </Grid> </Page>
Здесь определены две кнопки на нижней панели, для которых в файле кода C# пропишем обработчики:
using System; using System.Collections.Generic; using Windows.Storage; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.Storage.Pickers; namespace FoldersApp { public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } private async void saveButton_Click(object sender, RoutedEventArgs e) { var savePicker = new FileSavePicker(); // место для сохранения по умолчанию savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; // устанавливаем типы файлов для сохранения savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" }); // устанавливаем имя нового файла по умолчанию savePicker.SuggestedFileName = "New Document"; savePicker.CommitButtonText = "Сохранить"; var new_file = await savePicker.PickSaveFileAsync(); if (new_file != null) { await FileIO.WriteTextAsync(new_file, myTextBox.Text); } } private async void openButton_Click(object sender, RoutedEventArgs e) { FileOpenPicker openPicker = new FileOpenPicker(); openPicker.ViewMode = PickerViewMode.Thumbnail; openPicker.SuggestedStartLocation = PickerLocationId.Desktop; openPicker.CommitButtonText = "Открыть"; openPicker.FileTypeFilter.Add(".txt"); var file = await openPicker.PickSingleFileAsync(); if (file != null) { myTextBox.Text = await FileIO.ReadTextAsync(file); } } } }
FileOpenPicker и FileSavePicker имеют похожий набор свойств, которые позволяют кастомизировать диалоговые окна:
SuggestedStartLocation: указывает на каталог по умолчанию, который будет открываться в диалоговом окне.
В качестве значения можно указать одну из констант перечисления PickerLocationId. Например, каталог Документы - PickerLocationId.DocumentsLibrary
SuggestedFileName: устанавливает имя файла по умолчанию
CommitButtonText: устанавливает текст кнопки, которая и выполняет действие сохранения или открытия
DefaultFileExtension: расширение файла, которое будет добавляться к имени файла при сохранении, если другого расширения не будет указано (только для FileSavePicker)
FileTypeChoices: объект IDictionary, который содержит расширения файлов и их описания (только для FileSavePicker)
FileTypeFilter: объект List, который содержит список доступных расширений файлов (только для FileOpenPicker)
ViewMode: формат отображения списка файлов в диалоговом окне при их открытии (только для FileOpenPicker).
Принимает одну из двух констант: PickerViewMode.Thumbnail
(отображение файлов в виде значков) и PickerViewMode.List
(отображение файлов в виде списка)
При сохранении файла мы получаем указанное имя файла с расширением с помощью метода PickSaveFileAsync()
:
var new_file = await savePicker.PickSaveFileAsync();
Этот метод возвращает объект StorageFile, получив который, мы можем сохранять в него различное содержимое.
При открытии файла мы получаем выбранный файл с помощью метода PickSingleFileAsync()
:
var new_file = await savePicker.PickSaveFileAsync();
Этот метод также возвращает объект StorageFile, который представляет выбранный файл.
При этом надо подчеркнуть, что сохранение или открытие файла через диалоговые компоненты будет работать как на десктопах, так и на мобильных устройствах, только на смартфонах диалоговый компонент будет представлять последовательность экранов, на которых нам надо выбрать файл. Например, открытие файла для того же приложения на смартфоне проходит следующие экраны: