Oktatóanyag: Fájl mentése Windows App SDK választókkal a WinUI-ban

Amikor Windows alkalmazásokat készít Windows App SDK, a felhasználóknak gyakran kell fájlokat, például dokumentumokat, képeket vagy egyéb tartalmakat menteniük az eszközük meghatározott pontjaira. A Windows App SDK biztosítja a FileSavePicker osztályt egy konzisztens, felhasználóbarát felület létrehozásához, amellyel a felhasználók kiválaszthatják a fájlok mentési helyét és a nevüket.

Ez a cikk bemutatja, hogyan implementálhat fájlmentés-választót a WinUI-alkalmazásban. Megtudhatja, hogyan konfigurálhatja a választó megjelenését és viselkedését, hogyan kezelheti a felhasználó kiválasztását, és hogyan mentheti a tartalmat a kiválasztott helyre.

A mentési fájlválasztó feltölthető egy javasolt fájlnévvel és egyéb alapértelmezett beállításokkal, hogy a felhasználók könnyebben menthessék a fájljaikat:

Képernyőkép a

Előfeltételek

Mielőtt hozzákezd, győződjön meg arról, hogy:

  • Windows App SDK 1,8-at vagy újabb verziót. Az ebben a cikkben használt Microsoft.Windows.Storage.Pickers API-k a Windows App SDK 1.8-ban kerültek bevezetésre. Ha a projekt egy korábbi verziót céloz meg, az örökölt megközelítéshez tekintse meg a WinRT-választók használata HWND-interop használatával című témakört.
  • WinUI-projekt létrehozva a Windows App SDK-val
  • A C# és az XAML alapszintű ismerete
  • Az aszinkron/várakozási minták ismerete a C-ben#

Fontos API-k

Ebben a témakörben a következő API-kat használjuk:

A FileSavePicker használatával lehetővé teszi a felhasználók számára, hogy megadják azt a nevet és helyet, ahová az alkalmazás menteni szeretné a fájlt.

Dokumentum mentése a FileSavePicker használatával

Használjon FileSavePickert , hogy a felhasználók meg tudják adni a menteni kívánt fájl nevét, típusát és helyét. Hozzon létre, szabjon testre és jelenítsen meg egy fájlválasztó objektumot, majd mentse az adatokat a visszaadott PickFileResult használatával, amely tartalmazza a kiválasztott fájl elérési útját. Ha szüksége van a fájlnévre, abból az elérési útból származtathatja.

  1. Hozza létre és szabja testre a FileSavePickert. Először hozzon létre egy új FileSavePicker-objektumot , majd állítsa be az objektum tulajdonságait az alkalmazás és a felhasználók fájlválasztójának testreszabásához:
    using Microsoft.Windows.Storage.Pickers;
    ...
    var savePicker = new FileSavePicker(this.AppWindow.Id)
    {
        // (Optional) Specify the initial location for the picker. 
        //     If the specified location doesn't exist on the user's machine, it falls back to the DocumentsLibrary.
        //     If not set, it defaults to PickerLocationId.Unspecified, and the system will use its default location.
        SuggestedStartLocation = PickerLocationId.DocumentsLibrary,
        
        // (Optional) specify the default file name. If not specified, use system default.
        SuggestedFileName = "My Document",
    
        // (Optional) Sets the folder that the file save dialog displays when it opens.
        //     If not specified or the specified path doesn't exist, defaults to the last folder the user visited.
        SuggestedFolder = @"C:\MyFiles",
    
        // (Optional) specify the text displayed on the commit button. 
        //     If not specified, the system uses a default label of "Save" (suitably translated).
        CommitButtonText = "Save Document",
    
        // (Optional) categorized extension types. If not specified, "All Files (*.*)" is allowed.
        //     Note that when "All Files (*.*)" is allowed, end users can save a file without an extension.
        FileTypeChoices = {
            { "Documents", new List<string> { ".txt", ".doc", ".docx" } }
        },
    
        // (Optional) specify the default file extension (will be appended to SuggestedFileName).
        //      If not specified, no extension will be appended.
        DefaultFileExtension = ".txt",
    };
    #include <winrt/Microsoft.Windows.Storage.Pickers.h>
    using namespace winrt::Microsoft::Windows::Storage::Pickers;
    
    FileSavePicker savePicker(AppWindow().Id());
    
    // (Optional) Specify the initial location for the picker. 
    //     If the specified location doesn't exist on the user's machine, it falls back to the DocumentsLibrary.
    //     If not set, it defaults to PickerLocationId.Unspecified, and the system will use its default location.
    savePicker.SuggestedStartLocation(PickerLocationId::DocumentsLibrary);
    
    // (Optional) specify the default file name. If not specified, use system default.
    savePicker.SuggestedFileName(L"NewDocument");
    
    // (Optional) Sets the folder that the file save dialog displays when it opens.
    //     If not specified or the specified path doesn't exist, defaults to the last folder the user visited.
    savePicker.SuggestedFolder = L"C:\\MyFiles";
    
    // (Optional) specify the text displayed on the commit button. 
    //     If not specified, the system uses a default label of "Save" (suitably translated).
    savePicker.CommitButtonText(L"Save Document");
    
    // (Optional) categorized extension types. If not specified, "All Files (*.*)" is allowed.
    //     Note that when "All Files (*.*)" is allowed, end users can save a file without an extension.
    savePicker.FileTypeChoices().Insert(L"Text", winrt::single_threaded_vector<winrt::hstring>({ L".txt" }));
    
    // (Optional) specify the default file extension (will be appended to SuggestedFileName).
    //      If not specified, no extension will be appended.
    savePicker.DefaultFileExtension(L".txt");

Ez a példa hat tulajdonságot állít be: SuggestedStartLocation, SuggestedFileName, SuggestedFolder, CommitButtonText, FileTypeChoices és DefaultFileExtension.

Mivel a felhasználó egy dokumentumot vagy szövegfájlt ment, a minta a PickerLocationId Enum DocumentsLibrary értékével állítja be a SuggestedStartLocation fájlt a dokumentumtár mappájába. Állítsa a SuggestedStartLocation elemet a mentett fájl típusának megfelelő helyre, például zene, képek, videók vagy dokumentumok. A kezdőhelyen a felhasználó más helyekre is navigálhat és kijelölhet más helyeket.

A felhasználó gépelésének mentéséhez a példa egy SuggestedFileName nevet állít be. A javasolt fájlnévnek relevánsnak kell lennie a mentett fájlhoz. Például, például Word, javasolhatja a meglévő fájlnevet, ha van ilyen, vagy a dokumentum első sora, ha a felhasználó olyan fájlt ment, amely még nem rendelkezik névvel.

Használja a FileTypeChoices tulajdonságot a minta által támogatott fájltípusok (Microsoft Word dokumentumok és szövegfájlok) spektrálásakor. Ez biztosítja, hogy az alkalmazás a mentés után meg tudja nyitni a fájlt. Győződjön meg arról, hogy az alkalmazás minden megadott fájltípust támogat. A felhasználók a megadott fájltípusok bármelyikeként menthetik a fájljukat. Módosíthatják a fájltípust is, ha kiválasztanak egy másikat a megadott fájltípusok közül. A lista első fájltípus-kiválasztása alapértelmezés szerint ki lesz választva. Ennek szabályozásához állítsa be a DefaultFileExtension tulajdonságot.

Megjegyzés:

A fájlválasztó a jelenleg kijelölt fájltípussal is szűri a megjelenített fájlokat, így csak a kijelölt fájltípusoknak megfelelő fájltípusok jelennek meg a felhasználó számára.

Megjegyzés:

A FileSavePicker-objektumok a PickerViewMode.List nézet módban jelenítik meg a fájlválasztót.

  1. Ezután jelenítse meg a FileSavePickert , és mentse a kiválasztott fájlhelyre. A PickSaveFileAsync meghívásával jelenítse meg a fájlválasztót. Miután a felhasználó megadja a nevet, a fájltípust és a helyet, és megerősíti a fájl mentését, a PickSaveFileAsync egy egyszerűsített PickFileResult objektumot ad vissza, amely tartalmazza a mentett fájl elérési útját. Ha szüksége van a fájlnévre, abból az elérési útból származtathatja. Ha olvasási és írási hozzáféréssel rendelkezik, rögzítheti és feldolgozhatja a fájlt.
    using Microsoft.Windows.Storage.Pickers;
    ...
    var savePicker = new FileSavePicker(this.AppWindow.Id);
    var result = await savePicker.PickSaveFileAsync();
    if (result != null)
    {
        if (!System.IO.File.Exists(result.Path))
        {
            // Create a file and write to it.
            System.IO.File.WriteAllText(result.Path, "Hello world." + Environment.NewLine);
        }
        else
        {
            // Append to the existing file.
            System.IO.File.AppendAllText(result.Path, "Hello again." + Environment.NewLine);
        }
    }
    else
    {
        this.textBlock.Text = "Operation cancelled.";
    }
    #include <winrt/Microsoft.Windows.Storage.Pickers.h>
    #include <fstream>
    #include <string>
    using namespace winrt::Microsoft::Windows::Storage::Pickers;
    
    FileSavePicker savePicker(AppWindow().Id());
    auto result{ co_await savePicker.PickSaveFileAsync() };
    if (result)
    {
        // Check if the file exists.
        if (!std::ifstream(result.Path().c_str()))
        {
            std::ofstream outFile(result.Path().c_str());
            outFile << "Hello world.";
            outFile.close();
        }
        else
        {
            // Append to the existing file.
            std::ofstream outFile(result.Path().c_str(), std::ios::app);
            outFile << "Hello again.";
            outFile.close();
        }
    }
    else
    {
        textBlock().Text(L"Operation cancelled.");
    }

A példa ellenőrzi, hogy a fájl létezik-e, és vagy létrehoz egy új fájlt, vagy hozzáfűzi a meglévő fájlhoz. Ha a felhasználó megszakítja a műveletet, az eredmény az lesz null, és ezt az esetet megfelelően kezelheti, például megjeleníthet egy üzenetet a felhasználónak.

Jótanács

Minden további feldolgozás előtt ellenőrizze, hogy létezik-e és érvényes-e a mentett fájl. Ezután az alkalmazásnak megfelelően mentheti a tartalmat a fájlba. Az alkalmazásnak megfelelő viselkedést kell biztosítania, ha a kiválasztott fájl érvénytelen.