经常写入WPF Textbox会崩溃应用程序

时间:2014-12-15 16:45:42

标签: c# .net wpf textbox

我有一个带有多个标签的应用程序。其中一个标签是"报告"用作输出控制台的选项卡。当我第一次运行应用程序时,我读取了一个文件并向文本框写了2000行。当标签不是"报告"标签处于活动状态。

但是,我应该查看"报告" tab(使用Textbox)虽然写入了大量数据,但应用程序会写入一行或两行数据,然后不会响应。整个应用程序崩溃。

我用来更新的代码非常简单:

string timestamp = DateTime.Now.ToString("H:mm:ss");
string output = this.textbox_report_output.Text;
output += timestamp + ": " + message + "\n";
this.textbox_report_output.Text = output;
this.textbox_report_output.ScrollToEnd();

当我把WPF的文本框置于这种压力之下时,我的表现非常糟糕。我有什么可以做的吗?

3 个答案:

答案 0 :(得分:2)

  

我在使用WPF的Textbox时遇到了非常糟糕的表现。我能做些什么吗?

是的,您可以正确编写WPF,而不是假装它是Windows窗体。

在WPF中,我们使用数据绑定来更新UI而不是过程代码。我建议您对MSDN上的Data Binding Overview页面有一个很好的阅读,以帮助您入门,但它基本上是这样的:

创建string属性并实施INotifyPropertyChanged interface

public string Text { get; set; } // Implement the INotifyPropertyChanged interface

数据将其绑定到TextBox.Text属性:

<TextBox Text="{Binding Text}" />

设置值:

Text = "Some value";

在您仍在执行其他代码时,使用Dispatcher运行UI更新:

Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate { Text = "Some value"; });

答案 1 :(得分:1)

显然除了我要说的内容之外还有一些问题,但是由于你使用的是WPF,因此有更好的方式来更新UI而不是你正在使用的。您可以让WPF绑定系统处理更新UI的后勤工作,而不是像您一样推送更新。

这样,更新不会淹没UI线程。为此,要么创建DependencyProperty(或实现更改INotifyProperty),然后将文本框绑定到属性。

那就是说,如果应用程序崩溃,你可能会做错其他的事情。也许你正在泄漏内存并且你得到一个OutOfMemoryException?!或者也许是一些线程问题?!

答案 2 :(得分:0)

我同意其他两个回答,即数据绑定是wpf文本框输入和输出的最佳选择。但是,在某些情况下,您可能没有那么奢侈,尤其是当您需要的数据位于视图和您要访问的控件上时,通过远程处理和格式化UI输出非常重要。

如果要在OnTextChanged事件中设置Textbox.Text字段(使用日语或中文,并且输入内容为全角),则很有可能使系统崩溃。尝试捕获LostFocus事件,然后在那里进行更正。然后,我们可以安全地在Textbox.Text字段中设置该值。另外,您可以拦截KeyDown事件并删除小数点以外的非数字键。