1

Cancelというボタンを含むWPFウィンドウがあります。通常の状況では、ユーザーが Alt+C を押してアクションをキャンセルし、プログラムを閉じることができるようにしたいと考えています。そのため、ボタンには「_Cancel」というキャプションが付けられています。

問題 1: Window_Load 中に修飾子なしで C キーを押すと、Cancel_Clicked イベントが発生し、プログラムが終了します。

問題 2: プログラムが開いた後、ウィンドウ上で何も操作しないと仮定すると、修飾子なしで C を押すとプログラムが閉じます。

問題 2 により、ある種のブール値を使用して「ロード済み」ステータスを追跡することはできないことに注意してください。

私は何を間違っていますか?何か案は?

4

3 に答える 3

2

あなたの最善の解決策は、これをコマンドにリファクタリングすることです:

<Window.CommandBindings>
  <CommandBinding Command="Cancel" Executed="CancelExecuted" />
</Window.CommandBindings>

<Window.InputBindings>
  <KeyBinding Command="Cancel" Key="C" Modifiers="Alt"/>
</Window.InputBindings>
于 2009-11-06T16:06:54.430 に答える
1

これは標準的な動作のようです。(ブー!)

Visual Studio のような WPF アクセラレータ キー

http://blogs.msdn.com/saraford/archive/2004/04/16/114935.aspx

于 2009-11-06T15:56:20.477 に答える
1

これは、WinForms での動作と同じであることがわかりました。(私も、試しにテスト プロジェクトを作成するまでは信じられませんでした!)。これは、同じシナリオにヒットする以前の SO の質問です: Visual Studio のような WPF アクセラレータ キー

ホットキーを常に Alt 修飾子でトリガーするように強制したい場合は、アクションをコマンドにリファクタリングすることを検討できます。

これは、そのようなコマンドを実装する方法についての非常に簡単でハックなデモです。

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
}
于 2009-11-06T15:59:04.637 に答える