在我的Windows Forms应用程序中,我有一个子窗体,由主窗体以模态方式启动。子窗体充当向导执行长时间运行任务的角色,并包含“取消”按钮。在设计器中,我将此“取消”按钮的
不幸的是,该设置似乎无法持久化。为了保持响应性UI,长时间运行的任务在单独的
当我运行代码时,文本被设置为“关闭”,没有问题。
DialogResult
属性设置为DialogResult.Cancel
。但是,如果用户一直拒绝按“取消”按钮直到长时间操作完成,那么“取消”按钮的文本会更改为“关闭”。如果发生这种情况,我希望按钮的DialogResult
为DialogResult.None
。不幸的是,该设置似乎无法持久化。为了保持响应性UI,长时间运行的任务在单独的
Task
中运行,然后在任务完成后使用ContinueWith
块进行UI更新,该块又使用Invoke
来进行UI工作。代码大致如下:Task.Factory.StartNew(() =>
{
MyStaticClass.DoLotsOfWork(a, b, myCancellationToken);
return MyStaticClass.TellMeAboutIt(a, c, myCancellationToken);
}, myCancellationToken)
.ContinueWith(task =>
{
switch(task.Status)
{
case TaskStatus.RanToCompletion:
Invoke((MethodInvoker)delegate
{
cancelButton.Text = "Close";
cancelButton.DialogResult = DialogResult.None;
// other UI-related stuff.
}
// Other cases here...
}
});
当我运行代码时,文本被设置为“关闭”,没有问题。
DialogResult
看起来已经改变:如果我使用调试器进行步进,调试器告诉我值已经改变。然而,当窗口被关闭(使用取消/关闭按钮)时,myWindow.ShowDialog()
返回的 DialogResult
总是 DialogResult.Cancel
。这是一个 bug 吗?我做错了什么吗?一个人不能在程序中动态地设置按钮的 DialogResult
吗?
DialogResult
,仅在Button_Click
事件中处理它。接着,根据Button.Text
属性设置DialogResult
即可。 - dub styleecancelButton_Click
中使用this.Close()
。 - Eric Dand