Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Text-Suchfunktion in WPF
marlem
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Reutlingen

Themenstarter:

beantworten | zitieren | melden

Hallo,

ich entwickle einen Texteditor mit WPF. In Sachen WPF bin ich EINSTEIGER.
Ich habe ein Fokus-Problem bei der Suche. Das Suchfeld ist im selben Programmfenster wie das Editorfeld in das die Textdateien dargestellt werden.

Ich habe folgendermaßen die Suche programmiert:


private void edtSuchen_KeyPress(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                gefunden = TBXEditor.Text.IndexOf(edtSuchen.Text,gefunden);
                if (gefunden == -1) { gefunden = 0; }
                
                if (gefunden > 0)
                {
                  TBXEditor.SelectionStart = gefunden;
                  TBXEditor.SelectionLength = edtSuchen.Text.Length;
                  TBXEditor.Select(gefunden, edtSuchen.Text.Length);
                  gefunden++;
                };                
            }
        }

Ich habe zwei Probleme:
1.
Der gefundene Text wird trotz SelectionStart und SelectionLength nicht markiert angezeigt.

2. Wenn die Suche im Textfeld TBXEditor einmal ganz durch ist fuktioniert sie danach gar nicht mehr.

Wer kann mir helfen beide Probleme zu lösen.
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1.040

beantworten | zitieren | melden

Was für Typen sind TBXEditor und edtSuchen?
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 241
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Hallo marlem,

du ignorierst den den Fall, dass ein Treffer auch an Index 0 sein kann.
So sollte das Suchen durch den gesamten Text funktionieren (auch mehrmalig).


                gefunden = TBXEditor.Text.IndexOf(edtSuchen.Text,Math.Max(gefunden, 0));

                if (gefunden ≥ 0)
                {
                  TBXEditor.SelectionStart = gefunden;
                  TBXEditor.SelectionLength = edtSuchen.Text.Length;
                  TBXEditor.Select(gefunden, edtSuchen.Text.Length);
                  gefunden++;
                }

Grüße
spooky
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1.040

beantworten | zitieren | melden

Das Weitersuchen funktioniert auch mit seinem Code.
Nur wenn das letzte Vorkommnis gefunden wurde, gibt es 1x keinen Treffer - in beiden Varianten.

Das mit dem Index ≥ 0 ist natürlich ein guter Hinweis.

Bzgl. dem Problem, dass das Wort nicht markiert wird: Stichwort Focus. Das Wort ist schon markiert, die TextBox hat aber keinen Focus.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.176

beantworten | zitieren | melden

Hallo,

probiere mal LostFocus zu behandeln: System.Windows.Controls.TextBox "HideSelection" equivalent work-around
private Nachricht | Beiträge des Benutzers
marlem
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Reutlingen

Themenstarter:

beantworten | zitieren | melden

Beide sind TextBox.

<TextBox Name="edtSuchen" Width="150" ToolTip="Bitte Suchbegriff eingeben. Suche Starten mit der Enter-Taste" Focusable="True" KeyDown="edtSuchen_KeyPress" GotFocus="TextBox_GotFocus" LostFocus="TextBox_LostFocus" TabIndex="3"/>

<TextBox Name="TBXEditor" DockPanel.Dock="Top" MinWidth="525" MinHeight="240"  AcceptsReturn="True" FontSize="{Binding Path=SelectedValue.Content, ElementName=ComboboxFontsize}" FontFamily="{Binding Path=SelectedValue, ElementName=ComboboxFontname}" KeyboardNavigation.TabNavigation="Continue" KeyDown="TBXEditorBox_KeyDown" MouseLeave="TBXEditorBox_LostFokus" LostFocus="TextBox_LostFocus" TabIndex="6">
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
private Nachricht | Beiträge des Benutzers
Spook
myCSharp.de - Member



Dabei seit:
Beiträge: 241
Herkunft: Esslingen a.N.

beantworten | zitieren | melden

Zitat von p!lle
Das Weitersuchen funktioniert auch mit seinem Code.
Nur wenn das letzte Vorkommnis gefunden wurde, gibt es 1x keinen Treffer - in beiden Varianten.


Nicht, wenn der gesuchte Text an Index 0 steht ... (beide Bedingungen sind false, und so wird immer an 0 gesucht aber es passiert nichts!
private Nachricht | Beiträge des Benutzers
marlem
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Reutlingen

Themenstarter:

beantworten | zitieren | melden

Danke Spook! Dein Vorschlag hat das Problem mit der erneuten Suchen gelöst!
Vielen Dank!
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von marlem am .
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
private Nachricht | Beiträge des Benutzers
p!lle
myCSharp.de - Member

Avatar #avatar-3556.jpg


Dabei seit:
Beiträge: 1.040

beantworten | zitieren | melden

Zitat von Spook

Nicht, wenn der gesuchte Text an Index 0 steht ... (beide Bedingungen sind false, und so wird immer an 0 gesucht aber es passiert nichts!
Wenn das Wort nicht vorne steht, funktioniert das Weitersuchen. :tongue: Hast Recht.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von p!lle am .
private Nachricht | Beiträge des Benutzers
marlem
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Reutlingen

Themenstarter:

beantworten | zitieren | melden

@Th69
Ich habe folgendes versucht:


 private void edtSuchen_KeyPress(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                gefunden = TBXEditor.Text.IndexOf(edtSuchen.Text, Math.Max(gefunden, 0));
                if (gefunden ≥ 0)
                {
                    TBXEditor.SelectionStart = gefunden;
                    TBXEditor.SelectionLength = edtSuchen.Text.Length;
                    TBXEditor.Select(gefunden, edtSuchen.Text.Length);
                    gefunden++;
                    TBXEditor.Focus();
                }
            }
        }

und


 private void TBXEditorBox_LostFokus(object sender, RoutedEventArgs e)
        {
            if (ChkBarrierefrei.IsChecked.Value == true)
            {
                TBXEditor.Background = Brushes.White;
                TBXEditor.BorderBrush = Brushes.White;
                TBXEditor.BorderThickness = new Thickness(1);
            }

           e.Handled = true;
        }
Hat leider nichts geholfen.
Beim WEITER suchen wird das nächste gefundene Wort NICHT markiert.
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.176

beantworten | zitieren | melden

Schade.
Welches .NET Framework benutzt du? Ab 4.5 gibt es wohl die Eigenschaft IsInactiveSelectionHighlightEnabled.

Ansonsten gibt es noch den Weg mittels FocusManager: Correct way to keep selection in TextBox and RichTextBox visible after focus lost in WPF (aber auch hier muß der Fokus erst gesetzt worden sein).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
marlem
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Reutlingen

Themenstarter:

beantworten | zitieren | melden

Ich entwickle mit .NET-Frameworks 4.5.2

Habe das hier versucht:

TextBox Name="TBXEditor" DockPanel.Dock="Top" MinWidth="525" MinHeight="240"  AcceptsReturn="True" FontSize="{Binding Path=SelectedValue.Content, ElementName=ComboboxFontsize}" FontFamily="{Binding Path=SelectedValue, ElementName=ComboboxFontname}" KeyboardNavigation.TabNavigation="Continue" KeyDown="TBXEditorBox_KeyDown" MouseLeave="TBXEditorBox_LostFokus" LostFocus="TextBox_LostFocus" TabIndex="6" IsInactiveSelectionHighlightEnabled="True">

Hat nichts geholfen.
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von marlem am .
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
private Nachricht | Beiträge des Benutzers
marlem
myCSharp.de - Member



Dabei seit:
Beiträge: 68
Herkunft: Reutlingen

Themenstarter:

beantworten | zitieren | melden

@Th69
Du bist ein HELD!!!

FocusManager.IsFocusScope="True"

ist die Lösung!

Hier nochmal die ganze XAML-Zeile:

<TextBox Name="TBXEditor" DockPanel.Dock="Top" MinWidth="525" MinHeight="240"  AcceptsReturn="True" FontSize="{Binding Path=SelectedValue.Content, ElementName=ComboboxFontsize}" FontFamily="{Binding Path=SelectedValue, ElementName=ComboboxFontname}" KeyboardNavigation.TabNavigation="Continue" KeyDown="TBXEditorBox_KeyDown" MouseLeave="TBXEditorBox_LostFokus" LostFocus="TextBox_LostFocus" TabIndex="6" FocusManager.IsFocusScope="True">

Leute: Ihr seid spitze! Meine Suche funktioniert so wie ich sie haben wollte!
Vielen vielen vielen Dank!
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
private Nachricht | Beiträge des Benutzers