WPFのTextBoxでAcceptsReturnをtrueにしたときCtrl+Enterで改行ができない
いつもお世話になっております.
WPFでプログラミング用のテキストエディタを実装していて,Ctrl+Dで文を複製する機能を作ろうとしていたのですが,文が複製される際に改行が入らなかったのです.
調べていくうちに,Ctrl+Enterでは改行できないことがわかりました.(Ctrl+Dコマンドを実行際に複製する文をTextBoxに送っているのでコマンドが実行されている間はCtrlキーが押されている)
AcceptsReturnプロパティはTrueに設定しているので,Ctrlキーが押されていなければちゃんと改行ができます.
Ctrl+Enterで改行ができないなら,InputManagerでEnterキーを送っても改行が入力されないことはわかるのですが,TextCompositionManagerでTextを送る際に”\r\n”を送っても改行が入力されないのが,よくわかりません.
どのようにすればCtrlキーが押された状態で改行を入力できるようになるのでしょうか.
開発環境はWindows 10(1803),
VisualStudio 2017 ,
.NET Framework 4.5です.
以下ソースコードです
class Editor : TextBox {
//コンストラクタやほかの処理は省略
private void SendText(string text)
{
TextCompositionManager.StartComposition(new
TextComposition(InputManager.Current, this, text));
}
private void SendKey(Key key)
{
PresentationSource presentationSource =
PresentationSource.FromVisual(this);
InputManager.Current.ProcessInput(new
KeyEventArgs(Keyboard.PrimaryDevice, presentationSource, 100, key)
{
RoutedEvent = PreviewKeyDownEvent
});
}
public void Duplicate() //Ctrl+D
{
int current_line = GetCurrentLineNumber();
int current_start = SelectionStart;
string duptext = GetLineText(current_line);
SendText(Environment.NewLine + duptext);
SelectionStart = current_start;
}
}
InputManagerやTextCompositionManagerを採用した理由については,将来RichTextBoxにコードを移植した際に,Textプロパティを直接書き換える方法使った場合,Rtf値がリセットされて色情報が消えてしまうからです.
Ctrl+Dを押したときのイベント捕捉はXAMLのKeyBindingsで行っています.
よろしくお願いします.