1
我已经看到了这个问题:如何更改未聚焦文本框中的选择?
How to keep WPF TextBox selection when not focused?
,并实施解决方案的出现,让我的文本框显示选择,即使它不具有焦点。
但是,当我更改选择的开始或长度时,文本框中的任何内容都不会在视觉上发生变化。另外,当我以编程方式滚动文本框并且它没有焦点时,选择画笔不会随着文本滚动而移动。
我已经看到了这个问题:如何更改未聚焦文本框中的选择?
How to keep WPF TextBox selection when not focused?
,并实施解决方案的出现,让我的文本框显示选择,即使它不具有焦点。
但是,当我更改选择的开始或长度时,文本框中的任何内容都不会在视觉上发生变化。另外,当我以编程方式滚动文本框并且它没有焦点时,选择画笔不会随着文本滚动而移动。
如果您在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();
}
感谢信中,IsFocusScope解决方案似乎更优雅,而不是问题I中提出的解决方案。为了以编程方式更改选择,我仍然需要暂时关注文本框。 – Justin 2010-08-22 05:49:12