文件夹选取器 .NET MAUI

fre*_*ed_ 5 c# maui .net-6.0 maui-blazor .net-maui

我想做一个将图片保存到文件夹的下载器应用程序。该应用程序应该可以在 Windows 和 Macos 上运行,稍后可能会在 Android 和 iOS 上运行。

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

Ger*_*uis 21

我已经开始在 Windows 和 macOS 上实现这一点。您可以在这里查看代码: https: //github.com/jfversluis/MauiFolderPickerSample,并在这里写了一篇关于此的小博客文章: https: //blog.verslu.is/maui/folder-picker-with-dotnet-毛伊岛/

如果您想要访问特定于平台的 API,这遵循您想要使用的基本模式:

  • 定义一个接口
  • 在每个支持的平台上实现接口
  • 消费功能

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

public interface IFolderPicker
{
    Task<string> PickFolder();
}
Run Code Online (Sandbox Code Playgroud)

FilePicker.cs然后我们通过向文件夹添加新文件来创建 Windows 的实现Platforms\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();
            // Make it work for Windows 10
            folderPicker.FileTypeFilter.Add("*");
            // 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我FolderPicker在这里选择了我自己的对象的名称,所以与 Windows 存在命名冲突FolderPicker,这就是为什么顶部有奇怪的使用。如果您选择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();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我还在这里添加了MainPage和,以便我们的构造函数注入可以工作(在链接的存储库中App查看)。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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

实际上,.NET MAUI(常规)或 .NET MAUI Blazor 之间的调用不应有任何不同。

  • 经过进一步测试,我们最终发现 Windows 10 上的问题可以通过在 Windows 平台代码中添加以下内容来解决:folderPicker.FileTypeFilter.Add("*"); (6认同)