Laden...

Text-Suchfunktion in WPF

Erstellt von marlem vor 5 Jahren Letzter Beitrag vor 5 Jahren 2.139 Views
M
marlem Themenstarter:in
68 Beiträge seit 2018
vor 5 Jahren

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.

  1. 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

1.040 Beiträge seit 2007
vor 5 Jahren

Was für Typen sind TBXEditor und edtSuchen?

S
248 Beiträge seit 2008
vor 5 Jahren

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

1.040 Beiträge seit 2007
vor 5 Jahren

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.

M
marlem Themenstarter:in
68 Beiträge seit 2018
vor 5 Jahren

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

S
248 Beiträge seit 2008
vor 5 Jahren

Nur wenn das letzte Vorkommnis gefunden wurde, gibt es 1x keinen Treffer - in beiden Varianten.){gray}

Nicht, wenn der gesuchte Text an Index 0 steht ... (beide Bedingungen sind false, und so wird immer an 0 gesucht aber es passiert nichts!

M
marlem Themenstarter:in
68 Beiträge seit 2018
vor 5 Jahren

Danke Spook! Dein Vorschlag hat das Problem mit der erneuten Suchen gelöst!
Vielen Dank!

barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java

1.040 Beiträge seit 2007
vor 5 Jahren

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. 👅 Hast Recht.

M
marlem Themenstarter:in
68 Beiträge seit 2018
vor 5 Jahren

@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

4.931 Beiträge seit 2008
vor 5 Jahren

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).

M
marlem Themenstarter:in
68 Beiträge seit 2018
vor 5 Jahren

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.

barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java

M
marlem Themenstarter:in
68 Beiträge seit 2018
vor 5 Jahren

@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