C# 有没有办法同时搜索两个FlowDocument?
我在两个不同的堆栈面板中有两个并排的FlowDocuments。我需要一种方法来同时搜索两个文档以查找特定文本。就像我在文本框中键入“car”一样,flow document reader应该搜索并滚动到下一个“car”实例(如果有)。有没有办法做到这一点?FlowDocument位于FlowDocumentReader中。这里我有一个基本的WPF XAML布局,按照您的指定有两个FlowDocumentReader。我有一个搜索文本框,每当搜索文本更改时,我都会运行代码: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
<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总是为空。WhileBringIntoView()
实际上会将它带到视口
,但它不一定会将它带到视口
中的任何预设位置,我猜这就是您要找的,对不起。我只是假设您希望它位于视口
的顶部,所以这是我的错。但如果您想将文本带到它的最顶部,您可以使用除非有什么我不知道的,否则你实际上必须计算它。这就是我必须做的。是的,我只是想确保它对用户可见。而BringIntoView()
实际上会将它带到视口
,但它不一定会将它带到视口
中的任何预设位置,我猜这就是您要找的,对不起。我只是假设您希望它位于视口
的顶部,所以这是我的错。但如果您想将文本带到它的最顶部,您可以使用除非有什么我不知道的,你实际上必须计算它。这就是我必须做的。是的,我只是想确保它对用户可见。