You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinUI3中PageLoaded事件里ContentDialog无法显示的问题求助

问题分析与解决方案

核心问题1:对话框显示方法调用错误

你的ShowDialogAsync<T>方法原本通过Activator.CreateInstance<T>()创建实例,但ProcessingDialog只有带参数的构造函数,无参构造不存在,导致方法内部创建实例时抛出异常;而你手动创建的loadingDialog并未被传入方法中使用,相当于只初始化了对话框却没调用它的ShowAsync(),自然无法显示。

核心问题2:异步调用未等待

调用ShowDialogAsync时未使用await,异步操作上下文可能被中断,导致对话框无法完成初始化并显示。

核心问题3:异步任务定义与调用不规范

ProcessingTask的Action如果是异步操作,使用Action会导致async void,无法正确捕获异常且异步流程不受控,需改为Func<Task>。


具体修复步骤

1. 修改ShowDialogAsync方法,支持传入已创建的对话框实例

调整方法逻辑,直接使用外部初始化好的对话框,避免构造函数参数冲突:

public async Task<T> ShowDialogAsync<T>(T dialog) where T : ExtendedContentDialog
{
    try
    {
        dialog.Style = Application.Current.Resources["DefaultContentDialogStyle"] as Style;
        dialog.XamlRoot = App.MainWindow.Content.XamlRoot;

        await dialog.ShowAsync();

        return dialog;
    }
    catch (Exception ex)
    {
        // 可添加异常日志记录
        return null;
    }
}

2. 修正ProcessingTask的异步委托类型

将Action改为Func<Task>,支持异步任务的等待与异常捕获:

public class ProcessingTask
{
    public string Title { get; set; }
    public Func<Task> Action { get; set; }
}

3. 调整ProcessingDialog构造函数中的任务执行逻辑

改用异步任务并等待Action执行,确保异步流程可控:

public sealed partial class ProcessingDialog : ExtendedContentDialog
{
    public ProcessingDialog(IEnumerable<ProcessingTask> processingTasks)
    {
        this.InitializeComponent();
        Exceptions = new List<Exception>();

        // 使用async Task而非void,确保异常可追踪
        _ = Task.Run(async () =>
        {
            foreach (var task in processingTasks)
            {
                try
                {
                    // 确保UI线程更新任务标题
                    await DispatcherQueue.EnqueueAsync(() =>
                    {
                        CurrentTaskTitle = task.Title;
                    });

                    // 等待异步任务完成
                    await task.Action.Invoke();
                }
                catch (Exception ex)
                {
                    Exceptions.Add(ex);
                }
            }

            // 任务完成后关闭对话框
            await DispatcherQueue.EnqueueAsync(() =>
            {
                this.Hide();
            });
        });
    }

    // 其他属性保持不变...
}

4. 修正页面加载事件中的调用逻辑

确保在UI线程异步调用并等待对话框显示,同时修正Action的异步定义:

private async void Page_Loaded(object sender, RoutedEventArgs e)
{
    var loadingDialog = new ProcessingDialog(new List<ProcessingTask>
    {
        new ProcessingTask
        {
            Title = "Loading signals....",
            Action = async () =>
            {
                // 执行I/O密集型操作
                // ...

                // 更新UI元素
                await DispatcherQueue.EnqueueAsync(() =>
                {
                    SubjectFullName = _record.SubjectFullName;
                    RecordDateTime = _record.CreatedAt.ToString("yyyy/MM/dd HH:mm tt");
                });
            }
        }
    });

    // 等待对话框显示完成
    await ShowDialogAsync(loadingDialog);
}

5. 优化ExtendedContentDialog的Result属性设置(可选)

去掉覆盖的ShowAsync方法,改用Closed事件自动设置结果,避免方法覆盖带来的潜在问题:

public class ExtendedContentDialog: ContentDialog
{
    public static readonly DependencyProperty ResultProperty = DependencyProperty.Register(
        nameof(Result), 
        typeof(ContentDialogResult?), 
        typeof(ExtendedContentDialog), 
        new PropertyMetadata(null));

    public ContentDialogResult? Result
    {
        get => (ContentDialogResult?)GetValue(ResultProperty);
        set => SetValue(ResultProperty, value);
    }

    public ExtendedContentDialog()
    {
        Closed += OnDialogClosed;
    }

    private void OnDialogClosed(ContentDialog sender, ContentDialogClosedEventArgs args)
    {
        if (Result == null)
            Result = args.Result;
    }
}

额外检查点

  • 确认App.MainWindow已正确初始化,且Content的XamlRoot不为null
  • 检查DefaultContentDialogStyle资源在应用资源字典中存在,避免样式加载失败导致对话框不可见
  • 验证ProcessingDialog的XAML布局,确保进度条、任务标题等控件已正确绑定CurrentTaskTitle属性

内容的提问来源于stack exchange,提问作者RezaNoei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 08:45:04