我正在尝试从线程访问UI上的控件。从线程中,我有一个常量文本显示为状态日志。为了显示文字,我可以使用
GUI.richTextBox_statuslog.Dispatcher.Invoke(new delgClass(delegate() { GUI.richTextBox_statuslog.AppendText("Testing Started manual"); }));
这是可行的,但我没有将其放置在线程中的数百个位置中,而是尝试覆盖AppendText成员以使用Dispatcher。
调用,然后调用基本成员AppendText。
问题是,当我在下面使用我的代码时,XAML.cs或试图访问UI的线程中没有文本显示在日志中。
注意:我知道这不是最优雅的方法,但是我们只有1个线程,而且我们永远不需要更多线程,因此我试图避免使用异步之类的方法重写整个应用程序。
在XAML代码中:
local:RichTextBoxTS x:Name="richTextBox_statuslog" HorizontalAlignment="Left" Margin="5,160,0,0" VerticalAlignment="Top" Height="125" Width="630" VerticalScrollBarVisibility="Auto"
在XAML.cs代码中:
richTextBox_statuslog.AppendText("Non-thread access");
在RichTextBoxTS.cs代码中:
namespace Test_GUI
{
public delegate void delgClass();
public class RichTextBoxTS : RichTextBox
{
static RichTextBoxTS()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(RichTextBoxTS), new FrameworkPropertyMetadata(typeof(RichTextBoxTS)));
}
public new void AppendText(string value)
{
// Checking if this thread has access to the object.
if (Dispatcher.CheckAccess())
{
// This thread has access so it can update the UI thread.
base.AppendText(value + "\n");
}
else
{
// This thread does not have access to the UI thread.
// Place the update method on the Dispatcher of the UI thread.
Dispatcher.Invoke(new delgClass(delegate () { base.AppendText(value + "\n"); }));
}
}
}
}