WPF窗口无法关闭

5

能否向初学者解释一下,为什么在WorkflowTerminated事件触发后,这个小的WPF应用程序没有按预期关闭?所使用的工作流立即终止。(使用的是WPF应用程序、.Net Framework 3.5)

public partial class MainWindow : Window
{
    private WorkflowRuntime wfRuntime = new WorkflowRuntime();

    public MainWindow()
    {
        InitializeComponent();

        wfRuntime.WorkflowTerminated += (se, ev) => this.Close(); // this doesn't close the window
        wfRuntime.WorkflowCompleted += (se, ev) => this.Close();
    }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        WorkflowInstance launcherWorkflow = wfRuntime.CreateWorkflow(typeof(InstallerWorkflow));

        launcherWorkflow.Start();
    }
}

在终止事件处理程序中设置断点时,它是否会被执行? - ZoolWay
1
顺便说一句,这是个好问题,曾经困扰了我很久,非常难以解决,点赞。 - Teoman Soygul
1个回答

6

可能是因为回调函数在另一个线程上。一个基本的解决方法是使用Environment.Exit(1);完全终止应用程序。

要在UI线程上调用close函数,您应该使用:

wfRuntime.WorkflowTerminated += (se, ev) => {
    // call back to the window to do the UI-manipulation
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate() 
    {
       this.Close();
    }));
};

我的Application对象没有一个exit()方法。可能是因为它是一个WPF应用程序?我尝试了Application.Current.Shutdown(),但没有帮助。仍然没有关闭... - nabulke
我该如何将终止事件发送到正确的线程(GUI线程)? - nabulke
Environment.Exit()可以正常工作,应用程序正在关闭。但是感觉有点不规范;-)是否有更好的方法来达到我的目标(即在正确的线程中处理事件,以便Close()按预期工作?)尽管如此,还是感谢您迄今为止的帮助! - nabulke
2
是的,我更新了答案,以在UI线程上回调Close()方法,这样UI窗口就会正确关闭。 - Teoman Soygul
谢谢Teoman。现在它按预期工作了。不过看起来现在有点复杂,至少对于我这个初学者来说是这样的。 - nabulke
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接