重写XAML / WPF控件的继承成员以使用Dispatcher.Invoke

时间:2019-03-30 15:22:33

标签: wpf multithreading xaml thread-safety

我正在尝试从线程访问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"); }));
            }
        }
    }
}

0 个答案:

没有答案