【发布时间】:2022-07-25 15:42:55
【问题描述】:
我想做一个将图片保存到文件夹的下载器应用程序。该应用应该可以在 windows 和 macos 上运行,以后可能会在 android 和 ios 上运行。
我还没有找到选择目标文件夹的方法。关于如何使用 blazor 或 xaml .NET MAUI 应用程序实现它的任何想法?
【问题讨论】:
标签: c# .net-6.0 maui maui-blazor .net-maui
我想做一个将图片保存到文件夹的下载器应用程序。该应用应该可以在 windows 和 macos 上运行,以后可能会在 android 和 ios 上运行。
我还没有找到选择目标文件夹的方法。关于如何使用 blazor 或 xaml .NET MAUI 应用程序实现它的任何想法?
【问题讨论】:
标签: c# .net-6.0 maui maui-blazor .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();
}
然后我们通过将新文件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();
}
}
请注意,我还在此处添加了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 (regular) 或 .NET MAUI Blazor 之间实际上调用它应该没有什么不同。
【讨论】: