文件夹选取器 .NET MAUI

Folder Picker .NET MAUI

我想做一个将图片保存到文件夹的下载器应用程序。该应用程序应适用于 windows 和 macOS,稍后可能适用于 android 和 ios。

我还没有找到选择目标文件夹的方法。关于如何使用 blazor 或 xaml .NET MAUI 应用程序实现它的任何想法?

我已经开始为 Windows 和 macOS 实现它。您可以在此处查看代码:https://github.com/jfversluis/MauiFolderPickerSample and wrote a little blog post about this as well here: https://blog.verslu.is/maui/folder-picker-with-dotnet-maui/

如果您想访问 platform-specific API,这遵循您想要使用的基本模式:

  • 定义接口
  • 在每个支持的平台上实现接口
  • 使用功能

为此我创建了一个非常简单但有效的界面

public interface IFolderPicker
{
    Task<string> PickFolder();
}

然后我们通过将新文件 FilePicker.cs 添加到 Platforms\Windows\ 文件夹来为 Windows 创建一个实现。这使得它特定于 Windows 并允许我们编写 Windows 特定的代码。该文件包含此代码:

using WindowsFolderPicker = Windows.Storage.Pickers.FolderPicker;

namespace MauiFolderPickerSample.Platforms.Windows
{
    public class FolderPicker : IFolderPicker
    {
        public async Task<string> PickFolder()
        {
            var folderPicker = new WindowsFolderPicker();

            // Get the current window's HWND by passing in the Window object
            var hwnd = ((MauiWinUIWindow)App.Current.Windows[0].Handler.PlatformView).WindowHandle;

            // Associate the HWND with the file picker
            WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hwnd);

            var result = await folderPicker.PickSingleFolderAsync();

            return result.Path;
        }
    }
}

因为我在这里选择了FolderPicker作为我自己的对象的名称,所以与WindowsFolderPicker有命名冲突,这就是为什么在顶部有那个奇怪的using .如果您选择 MyFolderPicker 作为您的对象名称,则不需要。

现在我们在 MauiProgram.cs:

中使用通用主机构建器注册此接口和实现
public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
            });

// Note: this part was added

#if WINDOWS
        builder.Services.AddTransient<IFolderPicker, Platforms.Windows.FolderPicker>();
#elif MACCATALYST
        builder.Services.AddTransient<IFolderPicker, Platforms.MacCatalyst.FolderPicker>();
#endif
        builder.Services.AddTransient<MainPage>();
        builder.Services.AddTransient<App>();
// Note: end added part

        return builder.Build();
    }
}

请注意,我还在此处添加了 MainPageApp,以便我们的构造函数注入工作(查看链接存储库中的 MainPage.xaml.cs)。

现在我们可以按如下方式使用我们的功能:

namespace MauiFolderPickerSample;

public partial class MainPage : ContentPage
{
    private readonly IFolderPicker _folderPicker;

    public MainPage(IFolderPicker folderPicker)
    {
        InitializeComponent();
        _folderPicker = folderPicker;
    }

    private async void OnPickFolderClicked(object sender, EventArgs e)
    {
        var pickedFolder = await _folderPicker.PickFolder();

        FolderLabel.Text = pickedFolder;

        SemanticScreenReader.Announce(FolderLabel.Text);
    }
}

实施其他平台需要您实施您想要支持的平台的接口,并在通用主机构建器中注册它。这应该可以帮助您开始使用 Windows 和 macOS。

实际上调用它在 .NET MAUI(常规)或 .NET MAUI Blazor 之间应该没有任何区别。