0

我的 WPF 应用程序中有一个简单的 WPF 按钮和一个文本框(根本不使用 MVC 或绑定)。我希望能够在单击按钮后执行以下操作:

1)清除文本框

2) 创建结果

3)将结果分配给文本框

我使用了 Textbox.Clear、TextBox.Text=String.Empty、委托和调度程序方法,例如

private void button_Click(object sender, RoutedEventArgs e)
    {
        Application.Current.Dispatcher.BeginInvoke(new Action (ClearReportTxtBox), DispatcherPriority.Send);
        System.Threading.Thread.Sleep(5000);
        runTest();
    }


private void ClearReportTxtBox()
    {
        Report_textBox.Text = string.Empty;
    }

他们都没有为我正常工作。调度程序方法以某种方式工作,但不是我希望的那样。似乎清除任务将排队,当按钮单击处理程序中的所有操作完成时,它将开始发挥作用并删除文本框,但这会导致生成的报告并已分配给文本框(由 runtest 在上面的代码)也将被删除。因此,删除动作并消除整个结果为时已晚。

目前在我看来,通过单击按钮,UIthread 会阻止并获得控制权。完成按钮单击后,调度程序会将删除操作作为下一个操作排队。

是否可以在开始时强制删除,然后再做其余的?我想要达到的是我暂停按钮活动并在第一个操作时删除,然后继续按钮处理程序中的其余操作。

难道我做错了什么?

提前谢谢你的帮助。

4

1 回答 1

0

“Dispatcher.BeginInvoke”对于您想要做的事情有点奇怪

所有 UI 更新都必须在主线程上完成。由于“Button_click”事件在主线程上执行,您推送到 Dispatcher 的委托只能在 button_click 句柄完成后执行。这就是执行顺序变为 1. GUI 冻结的原因,因为 Thread.Sleep 2. RunTest 3. ClearReportTextBox

猜猜您可以尝试以下方式。

    private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
    {            
        ClearReportTxtBox();

        Task.Factory.StartNew(RunTest);
    }

    private void ClearReportTxtBox()
    {
        MyTextBox.Text = string.Empty;
    }

    private void RunTest()
    {
        System.Threading.Thread.Sleep(5000);

        if (dispatcher != null && !dispatcher.CheckAccess())
        {
            dispatcher.Invoke(priority, ()=> MyTextBox.Text = "123");
        }
        else
        {
            MyTextBox.Text = "123";
        }                
    }
于 2013-08-24T00:42:42.290 回答