C# 有没有办法同时搜索两个FlowDocument?

C# 有没有办法同时搜索两个FlowDocument?,c#,.net,wpf,user-interface,flowdocument,C#,.net,Wpf,User Interface,Flowdocument,我在两个不同的堆栈面板中有两个并排的FlowDocuments。我需要一种方法来同时搜索两个文档以查找特定文本。就像我在文本框中键入“car”一样,flow document reader应该搜索并滚动到下一个“car”实例(如果有)。有没有办法做到这一点?FlowDocument位于FlowDocumentReader中。这里我有一个基本的WPF XAML布局,按照您的指定有两个FlowDocumentReader。我有一个搜索文本框,每当搜索文本更改时,我都会运行代码: <Window

我在两个不同的堆栈面板中有两个并排的FlowDocuments。我需要一种方法来同时搜索两个文档以查找特定文本。就像我在文本框中键入“car”一样,flow document reader应该搜索并滚动到下一个“car”实例(如果有)。有没有办法做到这一点?FlowDocument位于FlowDocumentReader中。

这里我有一个基本的WPF XAML布局,按照您的指定有两个FlowDocumentReader。我有一个搜索文本框,每当搜索文本更改时,我都会运行代码:

<Window x:Class="WpfFlowTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfFlowTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

  <DockPanel>
    <!-- Search Box -->
    <TextBox Name="SearchTextBox" DockPanel.Dock="Top" TextChanged="TextBox_TextChanged"/>

    <!-- 2 Flow Readers -->
    <UniformGrid Columns="2">
      <FlowDocumentReader Name="FlowReader1">
        <FlowDocument>
          <Paragraph>
            Here is some text in panel number 1
          </Paragraph>
        </FlowDocument>
      </FlowDocumentReader>

      <FlowDocumentReader Name="FlowReader2">
        <FlowDocument>
          <Paragraph>
            Here is some more text in panel number 2
          </Paragraph>
        </FlowDocument>
      </FlowDocumentReader>
    </UniformGrid>
  </DockPanel>
</Window>

这里我有一个基本的WPF XAML布局,按照您的指定有2个FlowDocumentReader。我有一个搜索文本框,每当搜索文本更改时,我都会运行代码:

<Window x:Class="WpfFlowTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfFlowTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">

  <DockPanel>
    <!-- Search Box -->
    <TextBox Name="SearchTextBox" DockPanel.Dock="Top" TextChanged="TextBox_TextChanged"/>

    <!-- 2 Flow Readers -->
    <UniformGrid Columns="2">
      <FlowDocumentReader Name="FlowReader1">
        <FlowDocument>
          <Paragraph>
            Here is some text in panel number 1
          </Paragraph>
        </FlowDocument>
      </FlowDocumentReader>

      <FlowDocumentReader Name="FlowReader2">
        <FlowDocument>
          <Paragraph>
            Here is some more text in panel number 2
          </Paragraph>
        </FlowDocument>
      </FlowDocumentReader>
    </UniformGrid>
  </DockPanel>
</Window>

我已经为想要滚动的人发布了我的轻微修改

private void TextBox_TextChanged(object sender, EventArgs e)
        {
            var searchText = SearchTextBox.Text;

            if (searchText != null || searchText != "")
            {
                var FlowReader1 = (FlowDocumentReader)diffResults.Children[0];
                var FlowReader2 = (FlowDocumentReader)oldResults.Children[0];

                DoSearch(FlowReader1, searchText);
                DoSearch(FlowReader2, searchText);
            }
        }

        private void DoSearch(FlowDocumentReader reader, string search)
        {
            bool toScroll = true;
            var doc = reader.Document;
            var text = doc.ContentStart;

            var docRange = new TextRange(doc.ContentStart, doc.ContentEnd);
            docRange.ClearAllProperties();

            while (true)
            {
                var next = text.GetNextContextPosition(LogicalDirection.Forward);
                if (next == null)
                {
                    break;
                }

                var txt = new TextRange(text, next);

                int indx = txt.Text.IndexOf(search);
                if (indx >= 0)
                {   
                    var sta = text.GetPositionAtOffset(indx);
                    var end = text.GetPositionAtOffset(indx + search.Length);
                    if (end == null)
                    {
                        end = text.GetPositionAtOffset(indx + 1);
                    }
                    var textR = new TextRange(sta, end);

                    if (toScroll && text.Paragraph != null)
                    {
                        text.Paragraph.BringIntoView();
                        toScroll = false;
                    }
                    // Make it yellow
                    textR.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Yellow));
                }
                text = next;
            }

我已经为想要滚动的人发布了我的轻微修改

private void TextBox_TextChanged(object sender, EventArgs e)
        {
            var searchText = SearchTextBox.Text;

            if (searchText != null || searchText != "")
            {
                var FlowReader1 = (FlowDocumentReader)diffResults.Children[0];
                var FlowReader2 = (FlowDocumentReader)oldResults.Children[0];

                DoSearch(FlowReader1, searchText);
                DoSearch(FlowReader2, searchText);
            }
        }

        private void DoSearch(FlowDocumentReader reader, string search)
        {
            bool toScroll = true;
            var doc = reader.Document;
            var text = doc.ContentStart;

            var docRange = new TextRange(doc.ContentStart, doc.ContentEnd);
            docRange.ClearAllProperties();

            while (true)
            {
                var next = text.GetNextContextPosition(LogicalDirection.Forward);
                if (next == null)
                {
                    break;
                }

                var txt = new TextRange(text, next);

                int indx = txt.Text.IndexOf(search);
                if (indx >= 0)
                {   
                    var sta = text.GetPositionAtOffset(indx);
                    var end = text.GetPositionAtOffset(indx + search.Length);
                    if (end == null)
                    {
                        end = text.GetPositionAtOffset(indx + 1);
                    }
                    var textR = new TextRange(sta, end);

                    if (toScroll && text.Paragraph != null)
                    {
                        text.Paragraph.BringIntoView();
                        toScroll = false;
                    }
                    // Make it yellow
                    textR.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Yellow));
                }
                text = next;
            }

有没有办法将文档滚动到突出显示的文本?据我所知,没有一种内置的方法可以将文档滚动到突出显示的文本,但是如果您知道
线宽
页面填充
,以及任何其他填充或边距(如段落之间的间距),您可以自己计算在您的文档中。我希望有一种方法可以使用BringIntoView()方法滚动文档。我已经为想要滚动的人发布了我的轻微修改。我的FlowDocument包含一个表,出于某种原因,每当我搜索最后一行中的任何内容时,sta和/或end总是为空。是否有方法将文档滚动到突出显示的文本?据我所知,没有内置的方法将文档滚动到突出显示的文本,但如果您知道
线宽
页面填充
,以及任何其他填充或边距,您可以自己计算(比如段落之间的间距)我希望找到一种使用BringIntoView()的方法方法滚动文档。我已经为想要滚动的人发布了我的轻微修改。我的FlowDocument包含一个表,出于某种原因,每当我搜索最后一行中的任何内容时,sta和/或end总是为空。While
BringIntoView()
实际上会将它带到
视口
,但它不一定会将它带到
视口
中的任何预设位置,我猜这就是您要找的,对不起。我只是假设您希望它位于
视口
的顶部,所以这是我的错。但如果您想将文本带到它的最顶部,您可以使用除非有什么我不知道的,否则你实际上必须计算它。这就是我必须做的。是的,我只是想确保它对用户可见。而
BringIntoView()
实际上会将它带到
视口
,但它不一定会将它带到
视口
中的任何预设位置,我猜这就是您要找的,对不起。我只是假设您希望它位于
视口
的顶部,所以这是我的错。但如果您想将文本带到它的最顶部,您可以使用除非有什么我不知道的,你实际上必须计算它。这就是我必须做的。是的,我只是想确保它对用户可见。