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.
Wer kann mir helfen beide Probleme zu lösen.
barrierefreies Webdesign, barrierefreie Softwareentwicklung mit C#, barrierefreie Softwareentwicklung mit Java
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
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.
Hallo,
probiere mal LostFocus
zu behandeln: System.Windows.Controls.TextBox "HideSelection" equivalent work-around
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
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!
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
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.
@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
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).
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
@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