我有一个WPF窗口,其中包含一个名为Cancel的按钮。在一般情况下,我希望用户能够按Alt + C取消其操作并关闭程序。因此,该按钮标题为“_Cancel。”
问题1:在Window_Load期间,如果我按C而不使用修饰符,则会触发Cancel_Clicked事件,程序将关闭。
问题2:我的程序打开后,假设我没有与窗口上的任何内容交互,按C而不使用修饰符将关闭程序。
请注意,由于问题2,使用某种布尔值来跟踪“已加载”状态将不起作用。
我做错了什么?有什么想法吗?
答案 0 :(得分:2)
您最好的解决方案是将其重构为command:
<Window.CommandBindings>
<CommandBinding Command="Cancel" Executed="CancelExecuted" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Command="Cancel" Key="C" Modifiers="Alt"/>
</Window.InputBindings>
答案 1 :(得分:1)
看起来这是标准行为。 (啵!)
WPF Accelerator Keys like Visual Studio
http://blogs.msdn.com/saraford/archive/2004/04/16/114935.aspx
答案 2 :(得分:1)
我发现这与WinForms中的行为相同。 (我也不相信,直到我创建了一个测试项目来尝试它!)。以下是针对相同情况的先前SO问题:WPF Accelerator Keys like Visual Studio
如果要强制使用Alt修饰符始终触发热键,可以考虑将操作重构为命令。
这是一个关于如何实施这样一个命令的非常快速和hacky的演示。
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
this.InputBindings.Add(new KeyBinding(new DoActionCommand(() => DoIt()), new KeyGesture(Key.C, ModifierKeys.Alt)));
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DoIt();
}
private void DoIt()
{
MessageBox.Show("Did It!");
}
}
public class DoActionCommand : ICommand
{
private Action _executeAction;
public DoActionCommand(Action executeAction)
{
_executeAction = executeAction;
}
#region ICommand Members
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if (_executeAction != null)
{
_executeAction.Invoke();
}
}
#endregion
}