文件夹选取器.NET MAUI



我想做一个下载应用程序,将图片保存到文件夹中。该应用程序应该在windows和macos上运行,稍后可能在android和ios上运行。

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

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

若您想访问特定于平台的API,下面是您想要使用的基本模式:

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

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

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

然后,我们通过向PlatformsWindows文件夹添加一个新文件FilePicker.cs来创建一个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;
}
}
}

因为我在这里选择了FolderPicker作为我自己对象的名称,所以和WindowsFolderPicker有一个命名冲突,这就是为什么在顶部有这种奇怪的用法。如果你选择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。

好消息。NET Maui现在有一个文件夹选择器插件。好吧,所以NuGet包不仅仅是挑选文件夹,但这是一个不同的问题

https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/essentials/folder-picker?tabs=android

。NET MAUI社区工具包(CommunityToolkit.MAUI in NuGet(为您提供了一个非常易于使用和设置的文件夹选择器。

iOS和Windows不需要任何权限,但如果你还没有设置,Android需要。打开Platforms/Android/AndroidManifest.xml文件,并在清单节点中添加以下内容:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

然后在任何需要的地方包含以下代码:

async Task PickFolder(CancellationToken cancellationToken)
{
var result = await FolderPicker.Default.PickAsync(cancellationToken);
if (result.IsSuccessful)
{
await Toast.Make($"The folder was picked: Name - {result.Folder.Name}, Path - {result.Folder.Path}", ToastDuration.Long).Show(cancellationToken);
}
else
{
await Toast.Make($"The folder was not picked with error: {result.Exception.Message}").Show(cancellationToken);
}
}

或者你可以像我一样把它变成一个按钮点击事件:

private async void PickFolder_Clicked(object sender, EventArgs e)
{
CancellationTokenSource source = new();
CancellationToken token = source.Token;
var result = await FolderPicker.Default.PickAsync(token);

if (result.IsSuccessful)
{
SaveLocation.Text = result.Folder.Path; // SaveLocation is a textbox in my XAML file
}
}

只需确保为FolderPicker使用CommunityToolkit包,而不是为我自动填充的Windows库VS 2022。

using CommunityToolkit.Maui.Storage;

您还需要将CommunityToolkit添加到您的启动类中。

builder
...
.UseMauiCommunityToolkit()

到目前为止,我在安卓系统中运行良好,但我还没有在其他任何系统中测试过它。YMMV。

最新更新