【问题标题】:Folder Picker .NET MAUI文件夹选择器 .NET MAUI
【发布时间】:2022-07-25 15:42:55
【问题描述】:

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

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

【问题讨论】:

    标签: c# .net-6.0 maui maui-blazor .net-maui


    【解决方案1】:

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

    如果您想访问特定于平台的 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();
                // 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 作为我自己的对象的名称,所以与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 之间实际上调用它应该没有什么不同。

    【讨论】:

    • 嘿杰拉德,从测试这个解决方案看来,虽然这在 Windows 11 上运行,但在 Windows 10 上它返回以下错误: System.Runtime.InteropServices.COMException: 'Error HRESULT E_FAIL has been returned从对 COM 组件的调用。我已经用你的演示项目在多台机器上进行了测试,11 台工作正常,10 台总是抛出该错误。这是我们为 maui 创建的错误报告:github.com/dotnet/maui/issues/5443
    • 经过进一步测试,我们最终发现windows 10上的问题可以通过在windows平台代码中添加以下内容来解决:folderPicker.FileTypeFilter.Add("*");
    • 嗨杰拉德。我正在为一个小型 oss 项目寻找文件夹选择器。我注意到您的示例没有特定的许可,我想知道您是否愿意将其许可给其他人使用?
    • @AndyJohnson 这适用于所有 Stack Overflow:stackoverflow.com/help/licensing
    猜你喜欢
    • 2022-06-22
    • 2011-02-03
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2015-11-29
    • 2013-03-06
    • 2021-02-09
    相关资源
    最近更新 更多