在执行其他操作之前,如何在按钮处理程序中重置WPF中的文本框?
我的WPF应用程序中有一个简单的WPF按钮和一个文本框(根本不使用MVC或绑定)。单击按钮后,我希望能够执行以下操作: 1) 清除文本框 2) 创建结果 3) 将结果分配给文本框 我使用了Textbox.Clear、Textbox.Text=String.Empty、委托和类似的分派器方法在执行其他操作之前,如何在按钮处理程序中重置WPF中的文本框?,wpf,multithreading,asynchronous,wpf-controls,dispatcher,Wpf,Multithreading,Asynchronous,Wpf Controls,Dispatcher,我的WPF应用程序中有一个简单的WPF按钮和一个文本框(根本不使用MVC或绑定)。单击按钮后,我希望能够执行以下操作: 1) 清除文本框 2) 创建结果 3) 将结果分配给文本框 我使用了Textbox.Clear、Textbox.Text=String.Empty、委托和类似的分派器方法 private void button_Click(object sender, RoutedEventArgs e) { Application.Current.Dispatcher
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;
}
没有一个对我来说工作正常。dispatcher方法在某种程度上起了作用,但并不像我希望的那样。似乎清除任务将排队,当按钮单击处理程序中的所有操作完成时,它将开始运行并删除文本框,但这将导致生成的报告以及已分配给文本框(由上面代码中的runtest创建)的报告也将被删除。因此,删除操作并消除整个结果为时已晚
目前,在我看来,通过单击按钮,UIthread将阻塞并获得控制权。完成按钮单击后,调度程序将删除操作作为下一个操作排队
是否可以在开始时强制删除,然后执行其余操作?我想要达到的是暂停按钮活动,并在第一个操作时删除,然后在按钮处理程序中继续其余操作
我做错什么了吗
提前感谢您的帮助。对于您想做的事情,“Dispatcher.BeginInvoke”有点奇怪
所有UI更新都必须在主线程上完成。由于“Button_click”事件正在主线程上执行,因此您推入Dispatcher的委托只能在Button_click句柄完成后执行。这就是为什么执行序列变得
1.GUI冻结,因为线程。睡眠
2.运行测试
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";
}
}
异步操作的意义是什么?你就不能清除按钮处理程序中的文本框吗?这里让我困惑的是“创建结果”。在你的代码中,你在做什么,这一步到底在做什么?如果要为文本框指定其他内容,则只需执行该操作,而不是清除文本框,然后将其设置为其他内容。如果文本框是某种密集型过程,您可以在此期间禁用它。如果您确实需要运行异步的东西,您可以改用TPL任务吗?通过单击按钮,dispatcher就是您正在运行的线程。这一切的意义是什么。只需清除文本框和单击事件上的所有其他内容。我想在开始时重置(清除)文本框。问题是,如果文本框中有某种结果,通过(重新)单击按钮,它不会立即重置文本框,并且在按钮中的所有活动完成之前仍显示旧结果。感谢您的回复,但通过执行您的建议,出现了一个异常。新线程无法访问文本框,因为它似乎属于其他线程。