【问题标题】:Open windows in background在后台打开窗口
【发布时间】:2017-08-15 21:45:01
【问题描述】:

我正在主窗口中打开第二个窗口。此窗口用于显示进度条,因此我不想在应用程序打开时阻止它。

我的代码是:

public partial class MainWindow : Window, IDisposable
{
    private void doUpdate(object sender, UpdateInfosArgs e)
    {
        this.Dispatcher.BeginInvoke(new Action(() =>
        {
            using (DownloadingFileWindow dlw = new DownloadingFileWindow())
            {
                dlw.OnDownloadFileComplete += OnDownloadFileComplete;
                this.Dispatcher.BeginInvoke((Action)(() => dlw.ShowDialog()));
                // or dlw.Show();
            }
        }
    }
}

目前,当窗口显示时,当执行到using}时立即关闭。

有没有办法关闭窗口?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    要以非模态(非阻塞)方式打开对话框,您需要使用 Show() 而不是 ShowDialog()

    您的第二个问题是您的using 声明。这处理dlw 再次在using 块的末尾,关闭窗口。

    所以试试这个:

    private void doUpdate(object sender, UpdateInfosArgs e)
    {
        DownloadingFileWindow dlw = new DownloadingFileWindow();
        dlw.OnDownloadFileComplete += OnDownloadFileComplete;
        dlw.Show();
    }
    

    我认为没有必要在子窗口上显式调用Dispose()。请参阅 this question 了解相关讨论。

    【讨论】:

    • 你说得对,我使用的是处理我的窗口。我是否必须重写 DownloadingFileWindow.OnClose 才能正确调用 Dispose 函数?
    • @A.Pissicat 添加了一个指向讨论Dispose() 问题的问题的链接
    【解决方案2】:

    使用结束后对话框将关闭,因为使用方括号在完成使用方括号中的任务后会清理对象。

    要在 using 括号后保持打开状态,不得启动 using 的资源。

    DownloadingFileWindow dlw = new DownloadingFileWindow()
    dlw.OnDownloadFileComplete += OnDownloadFileComplete;
    this.Dispatcher.BeginInvoke((Action)(() => dlw.ShowDialog()));
    

    在 Dialog 内部,实现一个关闭例程,如 this.close();通过触发器。

    【讨论】:

    • 最好不使用但 ShowDialog 总是阻塞 mainWindows。 dlw.Show() 更好
    猜你喜欢
    • 2015-07-23
    • 2018-06-29
    • 1970-01-01
    • 2022-10-17
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    相关资源
    最近更新 更多