WPF Prism 模块添加应用程序快捷键的实践探索

本文介绍了一种在WPF Prism模块化环境中为特定模块添加快捷键的方法。通过自定义Behavior,可以在不直接修改窗口的情况下实现快捷键功能。文章提供了C#代码示例,演示如何使用依赖属性和事件处理程序来实现这一目标。

应用场景

给应用添加快捷键是很常见的场景,WPF下的一般做法是Window下添加 KeyBinding 。
但是WPF Prism模块化之后,有时候我们需要给某一个模块添加快捷键,本文主要讨论这种场景下的一种实践。

代码

参考链接 https://stackoverflow.com/a/42974477/14124583
基本思路通过 Behavior 找到控件的父窗体,添加 PreviewKeyDown 事件处理
修改了参考链接的代码来支持单键快捷键。

C#代码

    public class KeyboardShortcutBehavior : Behavior<FrameworkElement>
    {
        private Window _parentWindow;

        public static readonly DependencyProperty CommandProperty =
            DependencyProperty.Register(nameof(Command), typeof(ICommand),
            typeof(KeyboardShortcutBehavior), new FrameworkPropertyMetadata(null));

        public ICommand Command
        {
            get { return (ICommand)GetValue(CommandProperty); }
            set { SetValue(CommandProperty, value); }
        }

        public static readonly DependencyProperty ModifierKeyProperty =
            DependencyProperty.Register(nameof(ModifierKey), typeof(ModifierKeys),
            typeof(KeyboardShortcutBehavior), new FrameworkPropertyMetadata(ModifierKeys.None));

        public ModifierKeys ModifierKey
        {
            get { return (ModifierKeys)GetValue(ModifierKeyProperty); }
            set { SetValue(ModifierKeyProperty, value); }
        }

        public static readonly DependencyProperty KeyProperty =
            DependencyProperty.Register(nameof(Key), typeof(Key),
                typeof(KeyboardShortcutBehavior), new FrameworkPropertyMetadata(Key.None));

        public Key Key
        {
            get { return (Key)GetValue(KeyProperty); }
            set { SetValue(KeyProperty, value); }
        }

        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.Loaded += AssociatedObject_Loaded;
            AssociatedObject.Unloaded += AssociatedObject_Unloaded;
        }


        private void AssociatedObject_Loaded(object sender, RoutedEventArgs e)
        {
            _parentWindow = Window.GetWindow(AssociatedObject);
            if (_parentWindow != null)
            {
                _parentWindow.PreviewKeyDown += ParentWindow_PreviewKeyDown;
            }
        }

        private void ParentWindow_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            if (Command != null && Key != Key.None && Keyboard.Modifiers == ModifierKey && e.Key == Key)
                Command.Execute(null);
        }

        private void AssociatedObject_Unloaded(object sender, RoutedEventArgs e)
        {
            if (_parentWindow != null)
            {
                _parentWindow.PreviewKeyDown -= ParentWindow_PreviewKeyDown;
            }
        }

        protected override void OnDetaching()
        {
            base.OnDetaching();
            AssociatedObject.Loaded -= AssociatedObject_Loaded;
            AssociatedObject.Unloaded -= AssociatedObject_Loaded;
        }
    }

xaml代码

<UserControl ...
             xmlns:i="http://schemas.microsoft.com/xaml/behaviors" 
             ...>
        <behaviors:KeyboardShortcutBehavior Key="A" Command="{Binding Command0}" />
        <behaviors:KeyboardShortcutBehavior Key="A" ModifierKey="Ctrl" Command="{Binding Command1}" />
    <Grid>
        <TextBlock HorizontalAlignment="Center"
                   VerticalAlignment="Center"
                   FontSize="24"
                   Text="Message" />
    </Grid>
</UserControl>
### 如何在 WPF 中为 ContextMenu 设置快捷键WPF中,`ContextMenu`可以通过关联命令来响应特定的键盘组合从而实现快捷键功能。这通常涉及到定义命令并将其绑定到相应的菜单项上。 对于希望给定的 `MenuItem` 响应某个按键或组合键的情况,可以利用输入手势(InputGesture),特别是KeyGesture类[^1]。通过这种方式可以在用户按下指定的热键时触发对应的命令执行逻辑。 下面是一个简单的例子展示如何向 `ContextMenu` 的项目添加快捷键: ```xml <Window x:Class="WpfApp.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Grid> <!-- 定义一个具有上下文菜单的按钮 --> <Button Content="右击查看菜单" Width="150" Height="30"> <Button.ContextMenu> <ContextMenu> <!-- 创建带有快捷键的菜单项 --> <MenuItem Header="_复制 (Ctrl+C)" Command="ApplicationCommands.Copy"> <MenuItem.InputBindings> <KeyBinding Key="C" Modifiers="Control"/> </MenuItem.InputBindings> </MenuItem> <MenuItem Header="_粘贴 (Ctrl+V)" Command="ApplicationCommands.Paste"> <MenuItem.InputBindings> <KeyBinding Key="V" Modifiers="Control"/> </MenuItem.InputBindings> </MenuItem> </ContextMenu> </Button.ContextMenu> </Button> </Grid> </Window> ``` 在这个实例里,当鼠标右键点击按钮时会弹出包含两个选项:“_复制 (Ctrl+C)” 和 “_粘贴 (Ctrl+V)”。这里使用了下划线前缀的方式让Alt加上字母成为访问键;同时也指定了控制加对应英文字母作为全局快捷方式。注意这里的Command属性绑定了内置的应用程序命令,这些预定义好的命令已经实现了常见的编辑操作行为。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值