场景:类似于微信的Enter快捷键发送 输入文本时 Ctrl+Enter快捷键换行可使用如下方法绑定
Caliburn Micro绑定快捷键参考如下
Enter快捷键发送
Ctrl+Enter 换行
<TextBox
x:Name="messageInput"
Grid.Row="3"
MinHeight="30"
Margin="1"
cal:Message.Attach="[Key Enter] = [SendMessage]; [Gesture Ctrl+Enter] = [CtrlEnterPressed($source)]"
FontSize="14px"
Text="{Binding MessageInput, UpdateSourceTrigger=PropertyChanged}"
VerticalScrollBarVisibility="Visible" />
public void CtrlEnterPressed(object textBox)
{
if(textBox is TextBox tb)
{
int caretIndex = tb.CaretIndex;
tb.Text = tb.Text.Insert(caretIndex, Environment.NewLine);
tb.CaretIndex = caretIndex + Environment.NewLine.Length;
}
}
方式2 PreviewKeyDown 当需要粘贴时 多行数据必须设置AcceptsReturn="True",设置此会导致 Enter
不触发 KeyDown
的问题
<TextBox
x:Name="messageInput"
Grid.Row="3"
MinHeight="30"
cal:Message.Attach="[Event PreviewKeyDown] = [OnPreviewKeyDown($eventArgs, $source)]"
AcceptsReturn="True"
BorderBrush="{x:Null}"
BorderThickness="0"
FontSize="14px"
Text="{Binding MessageInput, UpdateSourceTrigger=PropertyChanged}"
TextWrapping="Wrap"
VerticalScrollBarVisibility="Auto" />
public void OnPreviewKeyDown(KeyEventArgs e, TextBox textBox)
{
if (e.Key == Key.Enter)
{
if (Keyboard.Modifiers == ModifierKeys.Control)
{
// Ctrl+Enter 插入换行
int caretIndex = textBox.CaretIndex;
textBox.Text = textBox.Text.Insert(caretIndex, Environment.NewLine);
textBox.CaretIndex = caretIndex + Environment.NewLine.Length;
}
else
{
// 普通 Enter 触发 SendMessage 并阻止默认行为
e.Handled = true; // 阻止 TextBox 处理 Enter
SendMessage();
}
}
}