Переопределить унаследованный элемент управления XAML / WPF для использования Dispatcher.Invoke - PullRequest
0 голосов
/ 30 марта 2019

Я пытаюсь получить доступ к элементам управления в пользовательском интерфейсе из потока.Из потока у меня есть постоянный текст, который отображается как журнал состояния.Чтобы отобразить текст, я могу использовать

GUI.richTextBox_statuslog.Dispatcher.Invoke(new delgClass(delegate() { GUI.richTextBox_statuslog.AppendText("Testing Started manual"); }));

, который работает, но вместо того, чтобы поместить это в сотни мест в потоке, я пытаюсь переопределить член AppendText, чтобы использовать Dispatcher.
Invoke, а затемвызывать членов базы AppendText.

Проблема в том, что когда я использую свой код ниже, в журнале не появляется текст из XAML.cs или из потока, пытающегося получить доступ к пользовательскому интерфейсу.

Примечание: я знаю, что это не такЭто самый элегантный способ сделать это, но у нас есть только 1 поток, и нам никогда не нужно больше потоков, поэтому я стараюсь избегать переписывания всего приложения с использованием чего-то вроде async.

В коде 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"); }));
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...