gpt4 book ai didi

c# - 在 xaml 中使用键绑定(bind)捕获一系列字符

转载 作者:行者123 更新时间:2023-12-03 11:02:27 25 4
gpt4 key购买 nike

我正在开发一个功能,用户可以按 1 到 9 或 'a' 到 'z' 来执行列表中的命令。我建立了对数字的支持,但我真的不喜欢我制作它的方式。

<Grid.InputBindings>
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D0" CommandParameter="0" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D1" CommandParameter="1" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D2" CommandParameter="2" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D3" CommandParameter="3" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D4" CommandParameter="4" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D5" CommandParameter="5" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D6" CommandParameter="6" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D7" CommandParameter="7" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D8" CommandParameter="8" />
<KeyBinding Command="{Binding ShortcutCharacterCommand}" Key="D9" CommandParameter="9" />
</Grid.InputBindings>

如果我以相同的方式实现剩余的字符,我将拥有一个巨大的绑定(bind)列表。不仅支持 信件 ,还有 小键盘 .我宁愿测试字符范围,就像我在应用程序的另一部分中使用 Winform 控件一样,使用代码:
if (e.KeyValue >= '1' && e.KeyValue <= '9' ||
e.KeyValue >= 'A' && e.KeyValue <= 'Z')
{
FavoriteShortcutKeyPressedCallBack.Raise(e.KeyValue);
}

我真的认为这是可能的,但我似乎无法找到解决方案或在互联网上找到符合 MVVM 模式的解决方案。

所以基本上我的问题是 ,如何在 WPF/MVVM 中以更通用、更优雅的方式完成?

我是如何解决的

我从 mm8 的答案中得到了建议使用 EventToCommandBinding。这导致了 XAML 中的以下代码:
<i:Interaction.Behaviors>
<behaviors:EventToCommandBehavior Event="PreviewTextInput"
Command="{Binding TextInputCommand}"
PassArguments="True" />
</i:Interaction.Behaviors>

ViewModel 有一个 TextInputCommand,它从 EventArgs 中读取文本并选择相应的项目。
public RelayCommand<TextCompositionEventArgs> TextInputCommand { get; set; }

private void HandleTextInputCommand(TextCompositionEventArgs args)
{
SelectItemBoundToShortcut(args.Text);
}

起初,我使用评论中建议的 user1672994 的 KeyDown 事件。但发现我必须考虑不同的键盘布局并单独检查小键盘字符。使用 PreviewTextInput 事件只是发送键入的文本,这正是我所需要的。

最佳答案

您可以处理 PreviewKeyDown事件。在 View 的代码隐藏中,然后从那里调用 View 模型的命令:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e)
{
var viewModel = DataContext as YourViewModel;
if (viewModel != null)
{
switch (e.Key)
{
case Key.D0:
viewModel.ShortcutCharacterCommand.Execute("0");
break;
case Key.D1:
viewModel.ShortcutCharacterCommand.Execute("1");
break;
//...
}
}
}

或者通过使用此处解释的交互触发器:

MVVM Passing EventArgs As Command Parameter

您也可以将事件处理程序中定义的功能包装在 attached behaviour 中。 .

关于c# - 在 xaml 中使用键绑定(bind)捕获一系列字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51150262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com