/ / Come posso modificare la selezione in una casella di testo non focalizzata? - wpf, casella di testo, selezione

Come posso modificare la selezione in una casella di testo non focalizzata? - wpf, textbox, selection

Ho visto questa domanda:

Come mantenere la selezione di TextBox WPF quando non focalizzata?

E ho implementato la soluzione lì, in modo che la mia casella di testo mostri la selezione, anche quando non è attiva.

Tuttavia, quando cambio l'avvio della selezione olunghezza, nulla cambia visivamente nella casella di testo. Inoltre, quando faccio scorrere la casella di testo in modo programmatico e non ha lo stato attivo, il pennello di selezione non si sposta con il testo mentre scorre.

risposte:

1 per risposta № 1

Se si definisce un ambito focus separato in XAML amantenere la selezione (vedere StackPanel di seguito) e impostare lo stato attivo in TextBox una volta (in questo caso quando la finestra si apre utilizzando FocusManager.FocusedElement), si dovrebbe vedere la selezione cambiare in modo programmatico.

Ecco un codice di esempio per iniziare:

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

Ecco un po 'di codice per gestire l'evento click button:

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();
}