/* * テキストの変更をIMEに伝えます。 */ void MyNotifyTextChanged(int sel_start, int sel_end, int new_text_length) { CoreTextRange modifiedRange; modifiedRange.StartCaretPosition = sel_start; modifiedRange.EndCaretPosition = sel_end; CoreTextRange new_range; new_range.StartCaretPosition = SelCurrent; new_range.EndCaretPosition = SelCurrent; editContext.NotifyTextChanged(modifiedRange, new_text_length, new_range); }
// Replace the text in the specified range. void ReplaceText(CoreTextRange modifiedRange, string text) { // Modify the internal text store. _text = _text.Substring(0, modifiedRange.StartCaretPosition) + text + _text.Substring(modifiedRange.EndCaretPosition); // Move the caret to the end of the replacement text. _selection.StartCaretPosition = modifiedRange.StartCaretPosition + text.Length; _selection.EndCaretPosition = _selection.StartCaretPosition; // Update the selection of the edit context. There is no need to notify the system // of the selection change because we are going to call NotifyTextChanged soon. SetSelection(_selection); // Let the CoreTextEditContext know what changed. _editContext.NotifyTextChanged(modifiedRange, text.Length, _selection); }
/* * キーが押された。 */ private void CoreWindow_KeyDown(CoreWindow sender, KeyEventArgs args) { Debug.WriteLine("<<--- Key Down {0}", args.VirtualKey); switch (args.VirtualKey) { case Windows.System.VirtualKey.Left: // 左矢印(←)キー // カーソルがあると文字の操作に邪魔なので、いったん取り除きます。 RemoveCursor(); if (0 < Selection.EndCaretPosition) { // テキストの選択位置が左端でない場合 // テキストの選択位置を1つ左に移動します。 Selection.EndCaretPosition--; Selection.StartCaretPosition = Selection.EndCaretPosition; // IMEに選択位置の変更を知らせます。 Debug.WriteLine("--->> NotifySelectionChanged"); editContext.NotifySelectionChanged(Selection); } // カーソルを挿入します。 InsertCursor(); break; case Windows.System.VirtualKey.Right: // 右矢印(→)キー // カーソルがあると文字の操作に邪魔なので、いったん取り除きます。 RemoveCursor(); if (Selection.EndCaretPosition < EditText.Inlines.Count) { // テキストの選択位置が右端でない場合 // テキストの選択位置を1つ右に移動します。 Selection.EndCaretPosition++; Selection.StartCaretPosition = Selection.EndCaretPosition; // IMEに選択位置の変更を知らせます。 Debug.WriteLine("--->> NotifySelectionChanged"); editContext.NotifySelectionChanged(Selection); } // カーソルを挿入します。 InsertCursor(); break; case Windows.System.VirtualKey.Delete: // Deleteキー // カーソルがあると文字の操作に邪魔なので、いったん取り除きます。 RemoveCursor(); if (Selection.EndCaretPosition < EditText.Inlines.Count) { // テキストの選択位置が右端でない場合 // テキストの選択位置の文字を1つ削除します。 EditText.Inlines.RemoveAt(Selection.EndCaretPosition); // 削除前のテキストの選択位置をセットします。 CoreTextRange modified_range; modified_range.StartCaretPosition = Selection.EndCaretPosition; modified_range.EndCaretPosition = Selection.EndCaretPosition + 1; // 削除後のテキストの選択位置をセットします。 Selection.StartCaretPosition = Selection.EndCaretPosition; // IMEにテキストの変更を知らせます。 Debug.WriteLine("--->> NotifyTextChanged"); editContext.NotifyTextChanged(modified_range, 0, Selection); } // カーソルを挿入します。 InsertCursor(); break; } }