/ / Comment puis-je modifier la sélection dans une zone de texte non focalisée? - wpf, zone de texte, sélection

Comment puis-je modifier la sélection dans une zone de texte non ciblée? - wpf, textbox, selection

J'ai vu cette question:

Comment garder la sélection WPF TextBox quand elle n'est pas concentrée?

Et j'ai implémenté la solution ici, de sorte que ma zone de texte affiche la sélection, même si elle n’a pas le focus.

Cependant, quand je change le début de la sélection oulongueur, rien ne change visuellement dans la zone de texte. De plus, lorsque je fais défiler la zone de texte par programme et qu'elle n'a pas le focus, le pinceau de sélection ne se déplace pas avec le texte lorsqu'il défile.

Réponses:

1 pour la réponse № 1

Si vous définissez une étendue de focus distincte dans XAML surconservez la sélection (voir StackPanel ci-dessous) et définissez le focus dans la zone de texte une fois (dans ce cas, lorsque la fenêtre s'ouvre à l'aide de FocusManager.FocusedElement), votre sélection devrait alors être modifiée par programme.

Voici un exemple de code pour vous aider à démarrer:

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

Voici un code pour gérer l'événement de clic de bouton:

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