【问题标题】:How do I solve this System.InvalidCastException in WinUI3 while trying to get the window handler?如何在尝试获取窗口处理程序时在 WinUI3 中解决此 System.InvalidCastException?
【发布时间】:2022-10-06 06:36:34
【问题描述】:

我正在 WinUI 3 中开发一个应用程序,我需要打开一个文件夹选择器对话框。为此,我访问了文档和 GitHub 页面,这就是我写的 (PrincipalPage.xaml.cs):

(...)
private async void Select_Click(object sender, Microsoft.UI.Xaml.RoutedEventArgs e)
{
    var task = SelectFile();
    await task;
}

public async Task SelectFile()
{
    var folderPicker = new FolderPicker();
    var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(this);
    WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hwnd);
    folderPicker.FileTypeFilter.Add(\"*\");
    var file = await folderPicker.PickSingleFolderAsync();
    storePath = file.Path;
    DestinationURLTextBox.Text = file.Path;
}
(...)

Image to show the exception

我试图找出我做错了什么,甚至试图将代码直接放在按钮单击方法下但没有任何改变。

这是外部配置的事情还是......只是我做错了什么?

  • 颜色表明这是第一次机会例外。如果继续调试 (F5) 会发生什么?
  • @CodeCaster 提示我选择一个 JIT 调试器,我选择了唯一一个可用的(VS 2022 的新实例),然后得到“无法附加到崩溃进程。调试器已附加”。然后它简单地关闭实例并返回代码。
  • 这段代码对我来说很好。确保您正在使用所有最新版本 (Microsoft.WindowsAppSDK 1.1.5 Microsoft.Windows.SDK.BuildTools 10.0.22621.1)

标签: c# winui-3


【解决方案1】:

由于此代码在PrincipalPage.xaml.cs,您将Page 传递给GetWindowHandle。您需要传递Window。

你可以这样做。

应用程序.xaml.cs

public partial class App : Application
{
    public Window? MainWindow { get; private set; }

    public App()
    {
        this.InitializeComponent();
    }

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        MainWindow = new MainWindow();
        MainWindow.Activate();
    }
}

PrincipalPage.xaml.cs

public sealed partial class PrincipalPage: Page
{
    public BlankPage1()
    {
        this.InitializeComponent();
    }

    private async void Select_Click(object sender, RoutedEventArgs e)
    {
        var task = SelectFile();
        await task;
    }

    public async Task SelectFile()
    {
        var folderPicker = new FolderPicker();

        var mainWindow = (App.Current as App)?.MainWindow;
        var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(mainWindow);

        WinRT.Interop.InitializeWithWindow.Initialize(folderPicker, hwnd);
        folderPicker.FileTypeFilter.Add("*");
        var file = await folderPicker.PickSingleFolderAsync();
        storePath = file.Path;
        DestinationURLTextBox.Text = file.Path;
    }
}

【讨论】:

    猜你喜欢
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2019-02-17
    • 1970-01-01
    相关资源
    最近更新 更多