【发布时间】:2010-07-17 13:11:07
【问题描述】:
一个窗口有一个 MenuItem 绑定到一个集合,MenuItem 有 ItemTemplate,其中包含另一个 MenuItem,它使用绑定附加属性:
<Menu Background="Transparent">
<MenuItem ItemsSource="{Binding SomeThings}" Header="Menu">
<MenuItem.ItemTemplate>
<DataTemplate>
<MenuItem Header="{Binding MenuTitle}" WpfApplication30:MainWindow.KeyGesture="{Binding KeyGesture}"/>
</DataTemplate>
</MenuItem.ItemTemplate>
</MenuItem>
</Menu>
数据源和附加属性的声明:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
DataContext = new {
SomeThings = new[]
{
new { MenuTitle = "Title 1", KeyGesture = new KeyGesture(Key.A, ModifierKeys.Control) },
new { MenuTitle = "Title 2", KeyGesture = new KeyGesture(Key.B, ModifierKeys.Control) },
new { MenuTitle = "Title 3", KeyGesture = new KeyGesture(Key.C, ModifierKeys.Control) },
} };
}
public static string GetKeyGesture(MenuItem obj)
{
return (string)obj.GetValue(KeyGestureProperty);
}
public static void SetKeyGesture(MenuItem obj, string value)
{
obj.SetValue(KeyGestureProperty, value);
}
public static readonly DependencyProperty KeyGestureProperty =
DependencyProperty.RegisterAttached("KeyGesture", typeof(KeyGesture), typeof(MainWindow),
new PropertyMetadata(OnSetKeyGestureCallback));
private static void OnSetKeyGestureCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
var window = GetWindow(dependencyObject);
var keyGesture = (KeyGesture)e.NewValue;
window.KeyDown += (sender, keyArgs) =>
{
if (keyArgs.Key == keyGesture.Key && keyArgs.KeyboardDevice.Modifiers == keyGesture.Modifiers)
{
window.Background = Brushes.AntiqueWhite;
}
};
}
调用 OnSetKeyGestureCallback 后,用户可以使用快捷方式执行操作。但是 OnSetKeyGestureCallback 只有在打开菜单后才会调用。因此,在用户打开菜单之前,快捷方式不可用。如何在窗口或菜单加载后立即调用 OnSetKeyGestureCallback?
【问题讨论】: