WPF:使用CommandManager.RegisterClassCommandBinding和RegisterClassInputBinding方法

23 篇文章 0 订阅
22 篇文章 0 订阅

这两个方法可以在自定义控件中建立内置WPF命令,比如WPF中TextBox内置复制,剪切,粘贴命令。其中RegisterClassInputBinding将一个命令和输入笔势(Input Gesture)联系在一起。这样响应输入笔势发生后,命令逻辑会运行。而RegisterClassCommandBinding则将命令和具体命令执行逻辑和命令判断逻辑联系起来。这样一个命令就有具体逻辑执行代码了。

下面自定义一个控件,继承与Button类型,使得按钮中的文字支持剪切和粘贴。在自定义类型的静态构造函数中用RegisterClassCommandBinding把剪切和粘贴的命令(对应ApplicationCommands类型的Cut和Paste属性)执行实现。用RegisterClassInputBinding则定义命令执行的快捷键。

代码:

    class MyButton : Button

    {

        static MyButton()

        {

            //使用CommandManager.RegisterClassCommandBinding和RegisterClassInputBinding方法

            //注册我们需要的剪切粘贴命令。

            CommandManager.RegisterClassCommandBinding(typeof(MyButton),

                new CommandBinding(ApplicationCommands.Cut, OnCutCommand));

            CommandManager.RegisterClassInputBinding(typeof(MyButton),

                new InputBinding(ApplicationCommands.Cut, new KeyGesture(Key.X, ModifierKeys.Control)));

            CommandManager.RegisterClassCommandBinding(typeof(MyButton),

                new CommandBinding(ApplicationCommands.Paste, OnPasteCommand));

            CommandManager.RegisterClassInputBinding(typeof(MyButton),

                new InputBinding(ApplicationCommands.Paste, new KeyGesture(Key.V, ModifierKeys.Control)));

        }

        public MyButton()

        {

            Focusable = true;

            Loaded += (ss, ee) => this.Focus();

        }

        //控件内命令执行

        protected virtual void OnCut()

        {

            Clipboard.SetText(Content.ToString());

            Content = null;

        }

        protected virtual void OnPaste()

        {

            Content = Clipboard.GetText();

        }

        //CommandBinding命令绑定事件方法

        private static void OnCutCommand(object sender, ExecutedRoutedEventArgs e)

        {

            var control = sender as MyButton;

            if (control != null)

            {

                control.OnCut();

            }

        }

        private static void OnPasteCommand(object sender, ExecutedRoutedEventArgs e)

        {

            var control = sender as MyButton;

            if (control != null)

            {

                control.OnPaste();

            }

        }

    }

然后在界面上,可以直接用Ctrl+X和Ctrl+V对按钮内容进行剪切粘贴(当然前提是按钮得有焦点),也可以用其他控件(ICommandSource执行者)来触发针对自定义按钮的命令(通过设置ICommandSource.CommandTarget)。

XAML:

    <StackPanel>

        <loc:MyButton x:Name="mybtn" Height="50">Mgen!</loc:MyButton>

        <Button Command="Cut" CommandTarget="{Binding ElementName=mybtn}">剪切</Button>

        <Button Command="Paste" CommandTarget="{Binding ElementName=mybtn}">粘贴</Button>

    </StackPanel>

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值