Button的DialogResult没有(重新)设置?

Eri*_*and 3 c# multithreading winforms

在我的Windows窗体应用程序中,我有一个子窗体,它由我的主窗体作为模态启动.子表单用作执行长时间运行任务的向导,并包含"取消"按钮.在设计器中,我将此"取消"按钮的DialogResult属性设置为DialogResult.Cancel.但是,如果用户拒绝按下"取消"按钮直到长操作完成,则"取消"按钮的文本变为"关闭".我想按钮的DialogResultDialogResult.None,如果发生这种情况.

不幸的是,设置似乎并不存在.为了维护响应式UI,长时间运行的任务在一个单独的运行中运行Task,然后在任务完成后的UI更新在一个ContinueWith块之后完成,这反过来用于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...
    }
});
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,文本设置为"关闭",没问题.在DialogResult 似乎改变:如果我穿行使用调试器,调试器告诉我的值已经改变.然而,当在关闭窗口(使用取消/关闭按钮)时,DialogResult返回由myWindow.ShowDialog()始终 DialogResult.Cancel.

这是一个错误吗?难道我做错了什么?一个人可以在运行DialogResult中以编程方式设置按钮吗?

Han*_*ant 5

将DialogResult设置为Cancel的原因不止一个.例如,您可能会在按钮的Click事件处理程序中调用Close().这会关闭窗口,但由于从未分配过DialogResult,Winforms必须假设取消.隐藏窗口是触发此窗口的另一种方式,当窗口不可见时,窗口不能保持模态.必然如此,所有其他窗口都被禁用,最后一个窗口被隐藏,用户再也无法返回程序.

处理对话状态的理智方法是只设置DialogResult属性.只要将其从None更改为其他内容,Winforms将关闭对话框,对话框结果将明确无误.因此,请考虑删除Click事件处理程序并将代码更改为:

case TaskStatus.RanToCompletion:
    Invoke((MethodInvoker)delegate
    {
        cancelButton.Text = "Close";
        cancelButton.DialogResult = DialogResult.OK;
    }
Run Code Online (Sandbox Code Playgroud)