TOC

This article has been localized into Polish by the community.

Okna dialogowe:

Okno "Zapisz plik"

Okno dialogowe "Zapisz plik" (SaveFileDialog) pomoże Ci wybrać lokalizację zapisu i nazwę dla pliku, gdy chcesz zapisać plik. Okno to działa i wygląda jak "Otwórz plik" (OpenFileDialog), którego użyliśmy w poprzednim artykule, z kilkoma małymi różnicami. Podobnie jak OpenFileDialog, SaveFileDialog jest standardowym oknem dialogowym systemu Windows, co oznacza że użytkownicy będą widzieć mniej więcej to samo okno dialogowe, niezależnie od tego czy inicjują je w Twojej aplikacji, czy np. w Notatniku.

Prosty przykład z oknem "Zapisz plik"

Dla rozpoczęcia tematu zacznijmy od użycia okna "SaveFileDialog" bez żadnych dodatkowych opcji, aby jedynie zapisać zawartość z kontrolki "TextBox" we wskazanym pliku:

<Window x:Class="WpfTutorialSamples.Dialogs.SaveFileDialogSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="SaveFileDialogSample" Height="300" Width="300">
    <DockPanel Margin="10">
        <WrapPanel HorizontalAlignment="Center" DockPanel.Dock="Top" Margin="0,0,0,10">
            <Button Name="btnSaveFile" Click="btnSaveFile_Click">Save file</Button>
        </WrapPanel>
        <TextBox Name="txtEditor" TextWrapping="Wrap" AcceptsReturn="True" ScrollViewer.VerticalScrollBarVisibility="Auto" />
    </DockPanel>
</Window>
using System;
using System.IO;
using System.Windows;
using Microsoft.Win32;

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

		private void btnSaveFile_Click(object sender, RoutedEventArgs e)
		{
			SaveFileDialog saveFileDialog = new SaveFileDialog();
			if(saveFileDialog.ShowDialog() == true)
				File.WriteAllText(saveFileDialog.FileName, txtEditor.Text);
		}
	}
}

Po kliknięciu przycisku "Save file", okno "SaveFileDialog " zostanie utworzone i wyświetlone dzięki wywołaniu metody ShowDialog(). Jeżeli zwróci ona wartość "true" podjęta zostanie próba zapisu zawartości kontrolki "TextBox" używając właściwości "FileName", która będzie zawierała miejsce zapisu oraz nazwę dla pliku wprowadzoną przez użytkownika.

W zależności od tego jakiej wersji systemu Windows używasz owe okno będzie wyglądało mniej więcej w ten sposób:

Filtr

Jak widać z pierwszego przykładu, ręcznie musiałem dodać rozszerzenie ".txt" do zamierzonej nazwy pliku podawanej w polu "File name", głównie dlatego że kontrolka ComboBox "Save as type" jest pusta. Identycznie jak w przypadku okna "OpenFileDialog", kontrolka ta jest definiowana za pomocą właściwości "Filter" i jest również w ten sam sposób wykorzystywana. Oto przykład definicji filtra:

saveFileDialog.Filter = "Text file (*.txt)|*.txt|C# file (*.cs)|*.cs";

Więcej informacji na temat definiowania filtra można znaleźć w poprzednim artykule "Okno dialogowe "Otwórz plik"", gdzie zostało to szczegółowo objaśnione.

Po zastosowaniu takiego filtra jak powyżej okno "SaveFileDialog" będzie wyglądało tak:

Dzięki zastosowaniu owego filtra w polu "File name" można podawać nazwę pliku bez konieczności dodawania jego rozszerzenia. Jest ono dodawane automatycznie na takie, jakie zostanie wybrane w kontrolce ComboBox "Save as type".

Ustawienie katalogu domyślnego

Katalog domyślny używany przez okno "SaveFileDialog" jest ustalany przez system Windows, ale dzięki użyciu właściwości "InitialDirectory" możemy go zmienić na własny. Zazwyczaj ustawia się tę właściwość na katalog jaki zażyczy sobie użytkownik, na katalog aplikacji lub po prostu na ostatnio używany katalog. Można go ustawić podając wprost ścieżkę dostępu w standardowym formacie zapisu, w ten sposób:

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

Jeżeli chcesz wykorzystać jeden z folderów specjalnych w systemie Windows, np. "Desktop", "My Documents" lub "Program Files", musisz zachować szczególną ostrożność, ponieważ mogą się one różnić w zależności od używanej wersji systemu Windows i są uzależnione od tego, który użytkownik jest zalogowany. Framework .NET przychodzi nam jednak z pomocą. Wystarczy użyć klasy "Environment" i jej stałych wyliczeniowych "SpecialFolder":

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

W przytoczonym przykładzie otrzymujemy ścieżkę do katalogu "My Documents", ale spójrzmy na stałą wyliczeniową "SpecialFolder" - zawiera ona wartości dające ścieżki dostępu do wielu interesujących katalogów. Pełna lista znajduje się w tym artykule MSDN.

Inne opcje

Oprócz możliwości wymienionych już w tym artykule, chcę jeszcze zwrócić uwagę na następujące właściwości, które pomogą Ci dostosować okno "SaveFileDialog" do Twoich potrzeb:

AddExtension - domyślnie ustawiona jest wartość "true". Właściwość ta określa, czy okno "SaveFileDialog" powinno automatycznie dołączyć stosowne rozszerzenie do nazwy pliku, jeśli użytkownik je pominie. Rozszerzenie będzie ustalone w oparciu o wybór użytkownika w filtrze. Jeżele nie jest to możliwe wtedy rozszerzenie przyjmie wartość właściwości "DefaultExt" (jeśli została określona). Jeżeli chcesz, aby Twoja aplikacja mogła zapisywać pliki bez podawania rozszerzeń musisz wyłączyć tę opcję.

OverwritePrompt - domyślnie ustawiona jest wartość "true". Właściwość ta określa, czy okno "SaveFileDialog" ma prosić użytkownika o potwierdzenie, gdy ten chce wprowadzić nazwę pliku skutkującą nadpisaniem istniejącego pliku. Zazwyczaj będziesz chciał pozostawić tę opcję włączoną, z wyjątkiem bardzo szczególnych zastosowań.

Title - możesz nadpisać tę właściwość, jeżeli chcesz, aby na belce tytułowej okna "SaveFileDialog" znajdował się twój tytuł. Domyślnie jest to "Save As" lub lokalny odpowiednik. Właściwość ta jest również dostępna dla okna "OpenFileDialog".

ValidateNames - domyślnie ustawiona jest wartość "true" i jeśli nie zostanie wyłączona, zapewnia że użytkownik może wprowadzić tylko poprawne nazwy plików dla systemu Windows przed zezwoleniem użytkownikowi na kontynuację pracy.


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!