/ / Wie kann ich die Auswahl in einem nicht fokussierten Textfeld ändern? - WPF, Textfeld, Auswahl

Wie kann ich die Auswahl in einer unfokussierten Textbox ändern? - wpf, Textfeld, Auswahl

Ich habe diese Frage gesehen:

Wie kann ich die WPF TextBox-Auswahl beibehalten, wenn sie nicht fokussiert ist?

Und habe die Lösung dort implementiert, so dass mein Textfeld die Auswahl anzeigt, auch wenn es keinen Fokus hat.

Wenn ich aber die Auswahl ändere oderLänge ändert sich nichts visuell im Textfeld. Wenn ich das Textfeld programmatisch scrolle und es nicht fokussiert ist, wird der Auswahlpinsel beim Scrollen nicht mit dem Text verschoben.

Antworten:

1 für die Antwort № 1

Wenn Sie in XAML einen separaten Fokusbereich definierenWenn Sie die Auswahl beibehalten (siehe StackPanel unten), und Sie den Fokus einmal in der TextBox festlegen (in diesem Fall, wenn das Fenster mit FocusManager.FocusedElement geöffnet wird), sollten Sie Ihre Auswahl programmatisch ändern.

Hier ist ein Beispielcode für den Einstieg:

<Window x:Class="RichTextFont2.Views.MainView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Main Window"
Height="400" Width="400"
FocusManager.FocusedElement="{Binding ElementName=myTextBox}"
FontSize="20">

<DockPanel>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="60"/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBox x:Name="myTextBox"
Grid.Row="0"
Text="Text that does not loose selection."
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto">
</TextBox>
<StackPanel Grid.Row="1" FocusManager.IsFocusScope="True">
<Button Content="Select Text" Click="Button_Click_MoveTextBox"/>
</StackPanel>
</Grid>
</DockPanel>
</Window>

Hier ist etwas Code, um das Button-Click-Ereignis zu behandeln:

private void Button_Click_MoveTextBox(object sender, RoutedEventArgs e)
{
if (myTextBox.SelectionStart >= myTextBox.Text.Length)
{
myTextBox.SelectionStart = 0;
}
else
{
myTextBox.SelectionStart += 9;
}
myTextBox.SelectionLength = 6;
myTextBox.LineDown();
}