एक समाधान है कि आदेश और बाइंडिंग को शामिल नहीं करता, स्वामित्व वाली ओवरराइड करने के लिए है विंडो की OnKeyDown
विधि और उस मेनू आइटम को खोजें जिसमें KeyGesture
है जो कीबोर्ड ईवेंट से मेल खाता है। यहाँ
protected override void OnKeyDown(KeyEventArgs e)
{
base.OnKeyDown(e);
// here I suppose the window's menu is named "MainMenu"
MainMenu.RaiseMenuItemClickOnKeyGesture(e);
}
और उपयोगिता कोड है कि कुंजीपटल घटना के साथ एक मेनू आइटम से मेल खाता है:
यहाँ खिड़की के OnKeyDown ओवरराइड के लिए कोड है
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;
}
}
स्रोत
2014-05-14 14:00:35