Ich habe zwei FlowDocuments Seite an Seite in zwei verschiedenen Stack Panels. Ich brauche eine Möglichkeit, beide Dokumente gleichzeitig nach einem bestimmten Text zu durchsuchen. Wie in, wenn ich "Auto" in das Textfeld eintippe, sollten beide Flussdokumentleser nach der nächsten Instanz von "Auto" suchen und scrollen, wenn es eine gibt. Gibt es einen Weg, dies zu erreichen? Das FlowDocument befindet sich in einem FlowDocumentReader.Sie können zwei FlowDocuments gleichzeitig durchsuchen?
Antwort
Hier habe ich eine grundlegende WPF XAML-Layout, mit 2 FlowDocumentReader wie Sie angegeben. Ich habe eine TextBox suchen und werde den Code hinter ausgeführt, wenn die Suchtextänderungen:
<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>
In den MainWindow.xaml.cs Datei ich diesen Code haben, die den Fluss Dokument markieren, wo der Text, was passt Sie eingegeben:
private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
var searchText = SearchTextBox.Text;
DoSearch(FlowReader1, searchText);
DoSearch(FlowReader2, searchText);
}
private void DoSearch(FlowDocumentReader reader, string search)
{
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);
var textR = new TextRange(sta, end);
// Make it yellow
textR.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(Colors.Yellow));
}
text = next;
}
}
ich habe meine leichte Modifikation für Menschen geschrieben, die blättern wollen.
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;
}
Während 'BringIntoView()' es tatsächlich in den 'Viewport' bringt, bringt es es nicht notwendigerweise zu einer voreingestellten Position im' Viewport', was ich denke, was Sie gesucht haben, tut mir leid. Ich nahm an, du wolltest es ganz oben auf dem "Viewport", also ist das mein Fehler. Aber wenn du den Text an die Spitze des Ganzen bringen willst, es sei denn, es gibt etwas da draußen, das ich nicht kenne, müsstest du es tatsächlich berechnen. Das musste ich tun. – Meloviz
Ja, ich wollte nur sicherstellen, dass es für den Benutzer sichtbar ist. – jailorboy
- 1. Können Sie mehr als eine Datenbank gleichzeitig durchsuchen mit biopython
- 2. können wir laufen zwei Applets gleichzeitig
- 3. Können Sie zwei Variablen gleichzeitig in R zuweisen?
- 4. Freigeben von FlowDocuments zwischen mehreren RichTextBoxes
- 5. Mehrere Modelle gleichzeitig durchsuchen mit Ransack
- 6. Wie finden Sie, wie viele Benutzer Ihre Webseite gleichzeitig durchsuchen?
- 7. Können zwei verschiedene Chef-Clients gleichzeitig auf demselben Host arbeiten?
- 8. Können zwei oder mehr Personen gleichzeitig ein Excel-Dokument bearbeiten?
- 9. Können zwei Threads denselben eingebetteten Python-Interpreter gleichzeitig verwenden?
- 10. Wie können zwei jQuery-Animationen gleichzeitig ausgeführt werden?
- 11. Zählen Sie zwei Python-Listen gleichzeitig auf?
- 12. So führen Sie zwei Funktionen gleichzeitig aus
- 13. Java (Swing) - Ziehen Sie zwei Fenster gleichzeitig
- 14. Drücken Sie zwei Tasten gleichzeitig mit Dragonfly
- 15. Öffnen Sie zwei Websites gleichzeitig in Zielrahmen
- 16. spielen zwei Videos gleichzeitig
- 17. Abfrage zwei Indizes gleichzeitig in Kibana 4?
- 18. javaFX, zwei MausEreignisse gleichzeitig
- 19. Zwei separate UIButtons, die sich dieselbe Presse teilen ... können nicht gleichzeitig zwei drücken
- 20. MySQL: Abfrage zwei Tabellen gleichzeitig
- 21. Zwei Mutex-Schlösser gleichzeitig halten
- 22. Wechseln Sie zwischen Datenbanken, verwenden Sie zwei Datenbanken gleichzeitig
- 23. Zwei CSS Regeln für :: Auswahl Textfarbe - Warum können sie nicht gleichzeitig ausgewählt werden?
- 24. So können Sie einen WCF-Dienst mit zwei Konsolenanwendungen gleichzeitig debuggen
- 25. Zwei WPF-Fenster gleichzeitig verschieben?
- 26. AS3 - Zwei Tasten gleichzeitig drücken
- 27. Iterate über zwei Arrays gleichzeitig
- 28. Hervorheben von zwei untergeordneten Steuerelementen gleichzeitig
- 29. Sortierung zwei ähnlicher Tabellen gleichzeitig
- 30. zwei verschiedene Video-Streams gleichzeitig anzeigen
Das ist eine ziemlich gute Lösung. – jailorboy
Gibt es eine Möglichkeit, das Dokument zum markierten Text zu scrollen? – jailorboy
Nach meinem Wissen gibt es keine eingebaute Möglichkeit, das Dokument zum markierten Text zu scrollen, aber Sie können es selbst berechnen, wenn Sie die 'LineHeight',' PagePadding' und andere Abstände oder Ränder (wie Abstände) kennen zwischen Absätzen) in Ihrem Dokument. – Meloviz