如何在 Caliburn.Micro 中绑定按键手势?

2023-11-26

如何让 Caliburn.Micro 将按键手势映射到 ViewModel 上的操作方法?

例如,我想实现一个选项卡式界面,并且希望我的 ShellViewModel 有一个 NewTab 方法,用户应该能够通过按键盘上的 Ctrl+T 来调用该方法。

我知道完整的 Caliburn 框架支持手势,但如何使用 Caliburn.Micro 来实现这一点?是否有某种方法可以将操作绑定到 RoutedCommand(因为 RoutedCommands 已经支持输入手势)?或者其他方式来获得手势支持?


我修改了example启用对全局键绑定的支持。 您只需将以下代码添加到您的视图中:

<i:Interaction.Triggers>
        <common:InputBindingTrigger>
            <common:InputBindingTrigger.InputBinding>
                <KeyBinding Modifiers="Control" Key="D"/>
            </common:InputBindingTrigger.InputBinding>
            <cl:ActionMessage MethodName="DoTheMagic"/>
        </common:InputBindingTrigger>
    </i:Interaction.Triggers>

每当按下 Ctr+D 时,DoTheMagic 方法就会被执行。以下是修改后的输入绑定触发器代码:

public class InputBindingTrigger : TriggerBase<FrameworkElement>, ICommand
  {
    public static readonly DependencyProperty InputBindingProperty =
      DependencyProperty.Register("InputBinding", typeof (InputBinding)
        , typeof (InputBindingTrigger)
        , new UIPropertyMetadata(null));

    public InputBinding InputBinding
    {
      get { return (InputBinding) GetValue(InputBindingProperty); }
      set { SetValue(InputBindingProperty, value); }
    }

    public event EventHandler CanExecuteChanged = delegate { };

    public bool CanExecute(object parameter)
    {
      // action is anyway blocked by Caliburn at the invoke level
      return true;
    }

    public void Execute(object parameter)
    {
      InvokeActions(parameter);
    }

    protected override void OnAttached()
    {
      if (InputBinding != null)
      {
        InputBinding.Command = this;        
        AssociatedObject.Loaded += delegate {
          var window = GetWindow(AssociatedObject);
          window.InputBindings.Add(InputBinding);
        };
      }
      base.OnAttached();
    }

    private Window GetWindow(FrameworkElement frameworkElement)
    {
      if (frameworkElement is Window)
        return frameworkElement as Window;

      var parent = frameworkElement.Parent as FrameworkElement;      
      Debug.Assert(parent != null);

      return GetWindow(parent);
    }
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Caliburn.Micro 中绑定按键手势? 的相关文章

  • C# 中包含表的消息框

    IEnumerable
  • 为什么多线程访问 WPF UI 控件会产生开销?

    我是否错过了 WPF 以及之前的 Windows 窗体 在开发多线程应用程序时需要编写大量重复代码的一些事情 应用程序中的每个 UI 控件最终都需要额外的代码行来获取和设置每个属性 internal delegate void SetEle
  • 如何设置和更改 WPF 中的文化

    我有一个 NET 4 0 WPF 应用程序 用户可以在其中更改语言 文化 我只是让用户选择一种语言 创建相应的 CultureInfo 并设置 Thread CurrentThread CurrentCulture cultureInfo
  • 如何动态更改 WPF 中 DataGridTextColumn 绑定上的转换器?

    我真的不明白 WPF 和 XAML 并且继承了一些写得很糟糕的代码 所以我可能会扼杀它 但这里是 我继承了一个绑定到 Person 对象列表 在代码后面 的 DataGrid 其中必要的 DataGridTextColumn 在 XAML
  • WPF:路由事件还是常规事件?

    在 WPF 中 我们有路由事件 什么时候应该使用这些来代替常规事件 路由事件具有特殊的行为 但如果您在引发事件的元素上处理事件 则该行为在很大程度上是不可见的 如果您使用任何建议的方案 路由事件就会变得强大 在公共根定义公共处理程序 组合您
  • 列表框未虚拟化

    我有一个未虚拟化的列表框 我显然错过了一些东西 但找不到它 它实际上是一个列表框内的一个列表框 外部列表框有一个 ItemTemplate 其中包含一个 Expander Expander 用于显示一组项目 Expander 的内容是显示项
  • 获取我“单击”/“mousedown”的元素的名称

    我有一个页面 其根元素是一个名为的网格Root 我有很多控件 比如TextBlock TextBox Grid Rectangle Border等等 谁是孩子Root 现在 我想要一个MouseDown or PreviewMouseDow
  • 如何将启动时窗口的位置定位到用户屏幕的右侧?

    我目前正在用 C 创建一个类似侧边栏的 WPF 应用程序 当用户启动应用程序时 我希望窗口自动将其自身定位到用户屏幕的一侧 我尝试了一些方法和谷歌搜索 但没有找到任何帮助 这是我正在尝试做的事情的一个例子 http prntscr com
  • WPF 在 .NET Framework 4.0 中的 x64 上启动缓慢

    我注意到 如果我为任何 CPU x64 构建 WPF 应用程序 则与在 x86 上启动 在发布和调试模式下 相比 启动 大约 20 秒 或加载新控件所需的时间要长得多 VS 的内部或外部 即使是最简单的 WPF 应用程序也会出现这种情况 该
  • “该类型不包含任何可访问的构造函数” - 具有无参数构造函数

    我正在尝试加载一个类作为静态资源
  • 给 MVVM 中的 View 一些命令

    假设我有一些用户控制权 用户控件有一些子窗口 用户控制用户想要关闭某种类型的子窗口 用户控制代码后面有一个方法 public void CloseChildWindows ChildWindowType type 但我无法调用此方法 因为我
  • wpf自定义控件:另一个矩形内的可拖动/可调整大小的矩形

    我正在研究一个带有两个矩形的控件 一个在另一个矩形内 我希望用户能够拖动内部矩形 调整其大小 如果可能的话 也可以在外部矩形的边界内旋转它 这些值应该是可绑定的 以便我可以在更新时将这些值存储在我的数据源中 是否已经有这样的控件或者有人有任
  • DockPanel 选项卡顺序

    我在 ItemsControl 的 DataTemplate 中设置了一个 DockPanel 如下所示
  • 文本框的自定义日期格式

    有关的 将3个文本框绑定在一起 相同的日期时间不同的格式 https stackoverflow com questions 35581427 binding 3 textboxes together same datetime diffe
  • wpf C# 中的内存泄漏

    我正在使用 GalaSoft MvvmLight 套件和 WPF Toolkit 开发 WPF MVVM v3 5 中 应用程序DataGrid and DatePicker 但是 每次加载应用程序时 我都会面临应用程序中的大量内存泄漏Us
  • 如何用ListBox制作自定义控件?

    我想用自定义的项目模板制作水平ListBox 所以我制作了它的基本模板 但是 我找不到将 事物 绑定到 WPF XAML 的示例 尤其是在 ListBox 填充了自定义项的情况下 我只是想动态添加 删除列表框中的项目 其中包含图像 标签 组
  • 我如何在 WPF 中模仿这种行为?

    我对 WPF 和 C 开发相当陌生 我正在制作这个应用程序 我不知道是否有人熟悉 VOIP App Discord 但他们有一个我非常喜欢的特定行为 并且想尝试使用 WPF 创建类似的风格 当您在 Discord 上添加服务器时 单击一个按
  • 绑定到后面代码中的相对源

    在我的 UserControl 中 我的 XAML 中有以下代码
  • XAML:如何定义要在多个项目中使用的数据模板和样式

    我开始使用 WPF net 3 5 sp1 仅使用 VS 尚未混合 开发桌面应用程序 我现在的情况是 我在几个库中有一些通用的可重用组件 我可以在哪里定义样式和数据模板 以便它们可以在多个项目中重复使用 从而获得一致的外观和感觉 我看过 R
  • 在wpf中移动鼠标

    我目前正在寻找一种在 wpf 中移动鼠标的方法 我发现的只是我无法可靠实现的非托管方法调用 有没有一种简单的方法可以将鼠标光标移动到某个地方 即 双击后 我肯定在这里遗漏了一些东西 添加对System Windows Forms dll的引

随机推荐

  • 使用可变参数和泛型时出现 ClassCastException

    我正在使用 java 泛型和可变参数 如果我使用下面的代码 我会得到一个ClassCastException 即使我根本不使用强制转换 更奇怪的是 如果我在 Android dalvik 上运行这个 异常中不会包含堆栈跟踪 如果我将接口更改
  • 检查s3存储桶中是否存在文件夹

    如何使用 Ruby on Rails 检查我的 s3 存储桶中是否存在某个文件夹 我正在使用 AWS S3 官方 gem 初始化全局连接后 AWS S3 Base establish connection access key id gt
  • 替换 MYSQL 中的非 ASCII 字符

    要将非 ASCII 字符转换为 ASCII 我使用了以下查询 UPDATE tablename SET columnToCheck CONVERT columnToCheck USING ASCII WHERE columnToCheck
  • 芹菜异常处理

    假设我有这个任务定义 def some other foo input raise Exception This is not handled return input app task bind True max retries 5 so
  • 专门化静态 constexpr 数据成员

    我有一个类来描述某种类型的一些特征 template
  • Hammer JS 无法与主干一起工作

    我正在尝试让 Hammer JS 事件与主干一起工作 但无法让它响应事件 我已经尝试过以下方法 http cijug ne t tech 2013 01 16 backbone hammer https gist github com kj
  • 如何调整 Google AdWords 跟踪像素以在 AngularJS 应用程序中使用?

    如何调整 AdWords 跟踪像素以使其在 AngularJS 应用程序中按预期运行 典型的跟踪代码如下所示
  • 更改 UIBarButtonItem 的宽度[重复]

    这个问题在这里已经有答案了 我怎样才能改变宽度UIBarButtonItem到 29 像素 属性宽度不起作用 我不想创建一个UIButton并使用initWithCustomView因为我希望方形背景适应导航栏颜色 我正在使用initWit
  • 如何将 graphql-type-json 包与 GraphQl 一起使用

    我无法让 GraphQL 识别 JSON 标量类型 我遵循了 apollo 文档 http dev apollodata com tools graphql tools scalars html Using a package 为我的架构定
  • 有哪些类型的宏/语法扩展/编译器插件?

    我对 Rust 生态系统中用于几个类似宏的事物的许多术语感到非常困惑 有人可以澄清有哪些宏 语法扩展 编译器插件并解释这些术语之间的关系吗 你说得对 它is令人困惑 特别是 因为大多数这些功能都不稳定并且经常变化 但我会尝试总结一下目前的情
  • 全屏视频切换 HTML

    HTML 5 中的视频标签确实令人着迷 我需要知道是否可以让用户切换全屏播放 我不想使用任何其他视频插件 我只需要使用视频标签 那么这可能吗 请帮帮我 您可以使用以下代码创建一个按钮 使视频进入全屏模式 JavaScript 代码
  • GC.SuppressFinalize 是否有保证?

    我在实践中的观察是GC SuppressFinalize并不总是抑制对终结器的调用 尽管如此 终结器仍可能被调用 因此我想知道是否GC SuppressFinalize具有以下性质request而不是一个保证通过系统 更多信息 如果需要 以
  • 如果间接调用sied方法则不会调用Sinon Spy

    Problem 在我们的代码库中 我们遇到了 sinon 的问题 可以使用下面的代码片段来重现该问题 问题是 这似乎是间接的所谓间谍还击力量false the console log明确指出该方法被调用 但spy called遗迹false
  • Jython 不会导入用户定义的类;导入错误:没有名为 ****** 的模块

    这几天我一直在用头撞墙 试图解决这个问题 我已经开始使用 Jython 进行快速原型设计 我遇到了一个看似非常基本的问题 但我似乎无法克服它 我是在JythonBook 的第 10 章当我尝试编写和使用 Beach 类时遇到了问题 从标记为
  • 通过文本转语音朗读时暂停电话铃声,然后恢复

    我正在制作一个来电者语音应用程序 它使用 TTS 说出来电者姓名 我想在 TTS 说话时暂停铃声 然后恢复铃声 根据我的研究 我们可以使用AudioFocus 希望如此 无论如何我正在使用以下代码 Update 我现在正在使用这段代码 pu
  • Java:如何将java.util.logging的语言更改为英语?

    我有 java util logging 将输出打印到文件 效果很好 然而 这些消息包含对应于日志级别以及记录消息的时间 如何让它打印英文而不是中文 这就是当前消息的样子 11月 08 2016 8 28 03 下午 mySamples t
  • 取消 Afnetworking 2.0 中的 Post 请求

    您好 我正在使用 AFnetworking 2 0 发出发布请求 我的请求看起来像这样 AFHTTPRequestOperationManager manager AFHTTPRequestOperationManager manager
  • 无法打开另一个 Excel 文件(当通过 .net 打开一个 Excel 时)

    我设计了一个 net 应用程序 它将在登录时打开 Excel 文件并用它来打印报告 当用户注销时它将被关闭 我将 Excel 文件的可见设置为 false 以便用户不知道后台进程 但是 如果任何人在此期间打开任何其他 Excel 文件 我的
  • 有没有办法使用javascript检测网络连接类型? [复制]

    这个问题在这里已经有答案了 我想知道是否有任何方法可以检查用户是否使用 javascript 从 2G 3G 4G 或 WiFi 连接 据我所知 只有 Mozilla 提供了网络信息 API 它有助于检测一般连接类型 如 wifi 蜂窝 等
  • 如何在 Caliburn.Micro 中绑定按键手势?

    如何让 Caliburn Micro 将按键手势映射到 ViewModel 上的操作方法 例如 我想实现一个选项卡式界面 并且希望我的 ShellViewModel 有一个 NewTab 方法 用户应该能够通过按键盘上的 Ctrl T 来调