0

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

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

4

1 回答 1

0

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

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

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

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

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

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();

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

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

            var result = await folderPicker.PickSingleFolderAsync();

            return result.Path;
        }
    }
}

因为我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();
    }
}

请注意,我还在此处添加了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 (regular) 或 .NET MAUI Blazor 之间应该没有什么不同。

于 2022-02-15T09:22:14.950 回答