Недавно я разрабатываю инструмент с WinUI, но теперь вижу проблему при использовании исключения FileOpenPicker
throw. В модели администратора вы, ребята, можете воспроизвести эту проблему с помощью следующего кода.
private async void myButton_Click(object sender, RoutedEventArgs e)
{
myButton.Content = "Clicked";
var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
// See the sample code below for how to make the window accessible from the App class.
var window = App.Current.m_window;
// Retrieve the window handle (HWND) of the current WinUI 3 window.
var hWnd = WinRT.Interop.WindowNative.GetWindowHandle(window);
// Initialize the file picker with the window handle (HWND).
WinRT.Interop.InitializeWithWindow.Initialize(openPicker, hWnd);
// Set options for your file picker
openPicker.ViewMode = PickerViewMode.Thumbnail;
openPicker.FileTypeFilter.Add("*");
// Open the picker for the user to pick a file
var file = await openPicker.PickSingleFileAsync();
if (file != null)
{
await Windows.Storage.FileIO.ReadTextAsync(file);
}
else
{
throw new Exception("file is null");
}
}
Чтобы убедиться, что приложение работает от имени администратора, отредактируйте профиль проекта следующим образом ответ .
Я знаю Win32 OpenFileDialog, но не знаю, как использовать его в WinUI. Можете ли вы поделиться каким-нибудь блогом или документом, большое спасибо.
Это тот «диалог», который вам нужен; или файлы? Вы можете направлять файлы с помощью стандартной библиотеки. UWP имеет прямой доступ только к своему изолированному или перемещаемому хранилищу; или файлы ресурсов.
К сожалению, FileOpenPicker
/FolderPicker
НЕ РАБОТАЮТ, когда приложение запущено от имени АДМИНИСТРАТОРА/ПОВЫШЕННЫХ.
Это известная проблема, и вы можете следить за ней в репозитории WinAppSDK GitHub здесь.
Это не работает, поскольку FilePicker был разработан в эпоху UWP для приложений, которые имели доступ только к локальным файлам через песочницу и под контролем конечного пользователя, поэтому это своего рода функция, ограниченная по дизайну. Я не считаю, что это добавляет какой-либо ценности разработчикам.
Однако вы можете сослаться на dll библиотеки классов и использовать формы Windows (или WPF) OpenFileDialog оттуда.
Фактически, чтобы разрешить использование Windows Forms из WinUI, вы можете просто создать проект библиотеки классов, в котором ничего нет, как, например, (UseWindowsForms
здесь важно, адаптируйте TargetFramework
к своим потребностям):
<Project Sdk = "Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0-windows10.0.19041.0</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
</PropertyGroup>
</Project>
Теперь вы можете сделать это из своего проекта WinUI, работающего от имени администратора:
using System.Windows.Forms; // needs a reference on ClassLibrary1
using Microsoft.UI;
using Microsoft.UI.Xaml;
namespace WithAdminApp
{
public sealed partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void myButton_Click(object sender, RoutedEventArgs e)
{
var ofd = new OpenFileDialog();
if (ofd.ShowDialog(new Win32Window(Win32Interop.GetWindowFromWindowId(AppWindow.Id))) == DialogResult.OK)
{
MessageBox.Show(ofd.FileName);
}
}
}
public class Win32Window(nint handle) : IWin32Window
{
public nint Handle => handle;
}
}
PS: вы также можете написать оболочку (или повторно использовать существующую) поверх интерфейса IFileDialog , который является корневым интерфейсом реализации файловых диалогов Windows, но ИМХО в большинстве случаев это совершенно излишне (за исключением, может быть, удобного просмотра папок ️ 🔁 https://stackoverflow.com/a/66187224/403671).
Это не работает. FilePicker был разработан в эпоху UWP для приложений, которые имели доступ к локальным файлам только через «песочницу» под контролем конечного пользователя. Что вы можете сделать, так это сослаться на dll библиотеки классов и использовать оттуда формы Windows или OpenFileDialog WPF (или написать свою собственную оболочку взаимодействия).