Hi,
In a WPF test app, I tried to uppercase all text in the RichTextBox in its TextChanged event handler, using the code below. In the TextChanged event handler, I first save the cursor position, and then uppercase all text in the RichTextBox, finally I restore the cursor position.
Under "EN English (United States)" keyboard layout, it is working fine, but if I switch to another keyboard layout, such as "EN English (United States)" keyboard layout, the cursor will jump forward when I type something into the middle of the text.
Could anyone help to explain to me why it is not working?
xaml
<Window x:Class="UKKeyboardTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="195" Width="491"><Grid><RichTextBox Height="51" HorizontalAlignment="Left" Margin="57,27,0,0" Name="richTextBox1" VerticalAlignment="Top" Width="335" /></Grid></Window>code behind
namespace UKKeyboardTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
bool _ignoreChanges = false;
public MainWindow()
{
InitializeComponent();
Paragraph p = new Paragraph();
p.Inlines.Add(new Run("sample text <<type some text here>> sample text"));
richTextBox1.Document = new FlowDocument(p);
richTextBox1.TextChanged += new TextChangedEventHandler(richTextBox1_TextChanged);
}
private void richTextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (_ignoreChanges) return;
int caretPosition = richTextBox1.Document.ContentStart.GetOffsetToPosition(richTextBox1.CaretPosition);
_ignoreChanges = true;
richTextBox1.SelectAll();
richTextBox1.Selection.Text = richTextBox1.Selection.Text.ToUpper();
_ignoreChanges = false;
richTextBox1.CaretPosition = richTextBox1.Document.ContentStart.GetPositionAtOffset(caretPosition);
}
}
}