如何从后台线程访问 WPF 控件

本文关键字:访问 WPF 控件 线程 后台 | 更新日期: 2023-09-27 18:36:15

我有一个富文本框,我正在尝试查找并突出显示与用户提供的查询匹配的所有单词。我的代码有效,但对于相当大的文档,它会挂起 UI,因为一切都在 UI 线程上完成。

List<TextRange> getAllMatchingRanges(String query)
    {
        TextRange searchRange = new TextRange(ricthBox.Document.ContentStart, ricthBox.Document.ContentEnd);
        int offset = 0, startIndex = 0;
        List<TextRange> final = new List<TextRange>();
        TextRange result = null;
        while (startIndex <= searchRange.Text.LastIndexOf(query))
        {
            offset = searchRange.Text.IndexOf(query, startIndex);
            if (offset < 0)
                break;
            }
            for (TextPointer start = searchRange.Start.GetPositionAtOffset(offset); start != searchRange.End; start = start.GetPositionAtOffset(1))
            {
                if (start.GetPositionAtOffset(query.Length) == null)
                    break;
                result = new TextRange(start, start.GetPositionAtOffset(query.Length));
                if (result.Text == query)
                {
                    break;
                }
            }
            if (result == null)
            {
                break;
            }
            final.Add(result);
            startIndex = offset + query.Length;
        }
        return final;
    }

这将返回一个文本范围列表,然后我可以突出显示该列表,但我无法在后台线程上执行它,因为它会引发异常,因为我会尝试在未创建它的线程上访问 richTextbox 的文档。

如何从后台线程访问 WPF 控件

一个选项是调度程序的后台优先级。让突出显示在后台进行,而不会阻止 UI 线程。

Application.Current.Dispatcher.BeginInvoke(
  DispatcherPriority.Background,
  new Action(() => {// Do your highlighting}));