Я пытаюсь получить доступ к элементам управления в пользовательском интерфейсе из потока.Из потока у меня есть постоянный текст, который отображается как журнал состояния.Чтобы отобразить текст, я могу использовать
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"); }));
}
}
}
}