如何在wpf prism应用程序中创建全局热键绑定,哪些模块可以动态添加热键?
我尝试了以下内容:
将Window.InputCommands
绑定到我的Hotkey类的ObservableCollection
(使用
共同服务作为模型)
- > InputCommands不包含可访问的setter
使用PreviewKeyDownEvent
(EventToCommand)
- >没有可靠的方法来确定是否按下了Ctrl或Alt(通过执行此操作)
我自己在ViewModel中)。我不喜欢这种做法。
有没有简单的方法动态添加键绑定?
答案 0 :(得分:1)
我不知道如何在纯MVVM中轻松动态地添加/删除。我想从代码隐藏中访问InputBindings,因为你正确地指出缺少setter。但是,您可能倾向于仅通过查看这两个案例来打破此案例的设计:InputBindings和KeyGesture。因此,请考虑为shell创建自定义控件。
public ObservableCollection<HotkeyModel> Hotkeys { get; private set; }
public class HotkeyWindow : Window
{
HotKeys = new ObservableCollection<HotkeyModel>();
HotKeys.CollectionChanged += new NotifyCollectionChangedEventHandler(HotkeysChanged);
}
void HotkeysChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if(e.Action == NotifyCollectionChangedAction.Add)
{
foreach(HotkeyModel hk in e.NewItems)
this.InputBindings.Add(new InputBinding(hk.Command), new KeyGesture(hk.Key, hk.Modifier));
}
else if(e. Action == NotifyCollectionChangedAction.Remove)
...
}
不要设置InputBindings,而是添加和删除。保留ObservableCollection的热键并监听CollectionChanged事件。在添加和删除它们时,您可以在InputBindings中添加和删除它们。在创建KeyGesture时,您可以设置Keyboard.Modifiers。
所以你可以把这个概念推断成一个真正彻底的MVVM设计,带有附加/依赖属性和附加行为等,以坚持我上面的例子现在忽略的View和ViewModel分离。