Một giải pháp không liên quan đến lệnh và ràng buộc là ghi đè quyền sở hữu Phương thức OnKeyDown
của Cửa sổ và tìm kiếm mục menu có KeyGesture
khớp với sự kiện bàn phím.
Đây là mã cho ghi đè onKeyDown của Window:
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
// here I suppose the window's menu is named "MainMenu"
MainMenu.RaiseMenuItemClickOnKeyGesture(e);
}
Và đây là mã tiện ích phù hợp với một mục trình đơn với sự kiện bàn phím:
public static void RaiseMenuItemClickOnKeyGesture(this ItemsControl control, KeyEventArgs args) => RaiseMenuItemClickOnKeyGesture(control, args, true);
public static void RaiseMenuItemClickOnKeyGesture(this ItemsControl control, KeyEventArgs args, bool throwOnError)
{
if (args == null)
throw new ArgumentNullException(nameof(args));
if (control == null)
return;
var kgc = new KeyGestureConverter();
foreach (var item in control.Items.OfType<MenuItem>())
{
if (!string.IsNullOrWhiteSpace(item.InputGestureText))
{
KeyGesture gesture = null;
if (throwOnError)
{
gesture = kgc.ConvertFrom(item.InputGestureText) as KeyGesture;
}
else
{
try
{
gesture = kgc.ConvertFrom(item.InputGestureText) as KeyGesture;
}
catch
{
}
}
if (gesture != null && gesture.Matches(null, args))
{
item.RaiseEvent(new RoutedEventArgs(MenuItem.ClickEvent));
args.Handled = true;
return;
}
}
RaiseMenuItemClickOnKeyGesture(item, args, throwOnError);
if (args.Handled)
return;
}
}
Nguồn
2014-05-14 14:00:35