質問

画面上のキーボードのテキストボックスの動作を作成しようとしています。テキストボックスのテキストを更新できますが、テキストボックスに焦点を合わせて、更新が完了したらテキストの最後にキャレットを移動することはできません。

私は両方の注文でtextbox.focus()とtextbox.select()を使用してみました。

御時間ありがとうございます

役に立ちましたか?

解決

マウスアップイベント(またはキーアップ)が元の要素にフォーカスを返すため、入力イベントハンドラー内(つまり、仮想キーをクリックするマウスクリック)からフォーカスを変更すると失敗します。それを機能させるには、フォーカスコマンドを後で使用して派遣する必要があります Dispatcher 物体。

例:

Dispatcher.Invoke(new Action(() =>
{
    textBox1.Focus();
    textBox1.SelectionStart = textBox1.Text.Length;
    // or textBox1.Select(textBox1.Text.Length,0);
}), System.Windows.Threading.DispatcherPriority.Background);

他のヒント

更新したら、テキストボックスの最後にカーソルを移動する簡単な例を示します。

TextBox.Focus();
TextBox.Text = "sometext ";
TextBox.SelectionStart = TextBox.Text.Length;

同様の状況があり、ここに示すように「テキスト変更された」ハンドラーをテキストボックスに添付しました。

<TextBox Name="tbTextEntry" Width="200" HorizontalAlignment="Center" Background="Plum" Text="{Binding Entered_text,Mode=TwoWay}" TextChanged="OnTextChanged_Handler"></TextBox>

そして、このようなイベントを処理しました(上記のコメントからジェフ・ベックに感謝します):

protected void OnTextChanged_Handler(object sender, RoutedEventArgs e)
{
    TextBox my_text_box = (TextBox)sender;
    my_text_box.SelectionStart = my_text_box.Text.Length;
    Debug.WriteLine("OnTextChanged_Handler called !");
    return;
}

これは、画面上のキーボードを離れて実際のキーボードの使用を開始する場合には非効率的です。なぜなら、それぞれの新しい文字が本物のキーボードでうまく機能するため、このハンドラーが不必要に呼び出されるからです。もっと効率的なソリューションを歓迎します!

それが役立つことを願っています。ありがとう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top