如何在未聚焦的文本框中更改选择?

时间:2010-08-18 03:08:21

标签: wpf textbox selection

我见过这个问题:

How to keep WPF TextBox selection when not focused?

并在那里实施了解决方案,以便我的文本框显示选择,即使它没有焦点。

但是,当我更改选择开始或长度时,文本框中没有任何视觉上的变化。此外,当我以编程方式滚动文本框并且没有焦点时,选择画笔在滚动时不随文本移动。

1 个答案:

答案 0 :(得分:1)

如果在XAML中定义一个单独的焦点范围以维持选择(请参阅下面的StackPanel)并在TextBox中设置焦点一次(在这种情况下,当使用FocusManager.FocusedElement打开Window时),那么您应该看到您的选择更改编程。

以下是一些示例代码,可帮助您入门:

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