【问题标题】:c# - WPF closing dialog from within the dialog without a buttonc# - WPF 在没有按钮的对话框中关闭对话框
【发布时间】:2019-01-16 10:02:13
【问题描述】:
SecondWindow secdWin = new SecondWindow();
secdWin.ShowDialog();

以上代码来自我的 MainWindow.xaml.cs

新窗口生成并执行它应该做的事情,然后我尝试从内部关闭它。

这是来自我的 SecondWindow.xaml.cs

public partial class SecondWindow : Window
{
    public SecondWindow()
    {
        InitializeComponent();
        Task initTask = new Task(() => Init());
        initTask.Start();
    }

    private void Init()
    {
        server = new ServerReply();
        //.. doing stuff with the server.
        server.Reply = response.Content;
        //I want to close the SecondWindow here.
    }
}

我试过了:

var w = Application.Current.Windows[0];
w.Close();

不行,我也试过了:

this.Close();

但无论我做什么,我得到的只是:

Exception thrown: 'System.InvalidOperationException' in WindowsBase.dll

【问题讨论】:

  • stackoverflow.com/help/mcve ...你没有提供你在哪里调用 Close ...我敢打赌你在不同的 UI 线程上做这个
  • 我用更多信息更新了我的原始帖子

标签: c# wpf dialog


【解决方案1】:

您应该在您的 Init 方法中使用 Dispatcher。例如,像这样:

Application.Current.Dispatcher.Invoke(() => this.Close());

【讨论】:

  • 谢谢!这似乎已经解决了这个问题,我想这是因为我开始了一项新任务但从未结束它? :o
  • 这不是结束任务。您的 Init 方法在另一个线程上运行,但您只能在 UI 线程上关闭窗口。在这种情况下,调度员会这样做:)
  • 哦,我明白了!感谢您帮助我理解它的工作原理:D
【解决方案2】:

async Loaded 事件处理程序中运行并await 任务:

public SecondWindow()
{
    InitializeComponent();
    Loaded += WindowLoaded;
}

private async void WindowLoaded(object sender, RoutedEventArgs e)
{
    await Task.Run(() => Init());
    Close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多