Как я могу изменить выделение в несфокусированном текстовом поле? - PullRequest
1 голос
/ 18 августа 2010

Я видел этот вопрос:

Как сохранить выделенный текстовый блок WPF, когда он не сфокусирован?

И реализовали там решение, так что мое текстовое поле показывает выделение, даже когда оно не имеет фокуса.

Однако, когда я изменяю начало или длину выделения, в текстовом поле ничего не меняется визуально. Кроме того, когда я прокручиваю текстовое поле программно и у него нет фокуса, кисть выбора не перемещается вместе с текстом при прокрутке.

1 Ответ

1 голос
/ 21 августа 2010

Если вы определяете отдельную область фокуса в XAML для поддержки выделения (см. StackPanel ниже) и устанавливаете фокус в TextBox один раз (в этом случае, когда окно открывается с помощью FocusManager.FocusedElement), вы должны увидеть изменение вашего выборапрограммно.

Вот пример кода, с которого можно начать:

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

Вот код для обработки события нажатия кнопки:

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