文件夹选取器 .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();
}
}
请注意,我还在此处添加了 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);
}
}
实施其他平台需要您实施您想要支持的平台的接口,并在通用主机构建器中注册它。这应该可以帮助您开始使用 Windows 和 macOS。
实际上调用它在 .NET MAUI(常规)或 .NET MAUI Blazor 之间应该没有任何区别。
我想做一个将图片保存到文件夹的下载器应用程序。该应用程序应适用于 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();
}
}
请注意,我还在此处添加了 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);
}
}
实施其他平台需要您实施您想要支持的平台的接口,并在通用主机构建器中注册它。这应该可以帮助您开始使用 Windows 和 macOS。
实际上调用它在 .NET MAUI(常规)或 .NET MAUI Blazor 之间应该没有任何区别。