2010-11-25 23 views
1

はそれがAltキー + F4(だけでなく、X閉じるボタン+ <system menu> :: Close)を持つことが可能ですIsCancelとしてマークされているボタンをトリガ? Escキーを押すのと同じ方法で動作させたいと思います。ALT + F4とIsCancelボタン

注:私はプリズムを使用していますし、ダイアログがRegionBehaviorで作成されているので、私は直接ボタンにアクセスすることはできません

答えて

0

私はこれをカスタム動作でサポートしました。そのコードは以下のとおりです。私は、誰かが考えることができれば、よりクリーンな実装(たとえば、ボタンにビヘイビアを追加する必要はありません)に切り替えることができます。

(Rxのに基づいています)の実装には、いくつかの注意事項:

  • それは、キャンセルボタンをクリックすると、常に閉鎖されているウィンドウをもたらすことを前提としています。取り消しボタンをキャンセルすると(言い換えれば)、ウィンドウが閉じられたときにボタンがクリックされなくなります。
  • ボタンが何らかの形でウィンドウから削除された場合(この例では、別のコンテンツがリージョンにスワップされます)、その動作はデタッチされます。
  • すべてのイベントハンドラは、ウィンドウが閉じられたか、ボタンがクリックされたか、またはボタンが削除されたかにかかわらず、シーケンスの最後に削除されます。

そして、ここのコードです:

public class DialogCancelButtonBehavior : Behavior<Button> 
{ 
    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     Button button = AssociatedObject; 

     GetWindowAsync(button) 
      .SelectMany(window => GetWindowClosed(window)) 
      .Where(_ => button.IsCancel) 
      .TakeUntil(GetButtonClicked(button)) 
      .TakeUntil(GetButtonUnloaded(button)) 
      .Subscribe(_ => ClickButton(button)); 
    } 

    private IObservable<Window> GetWindowAsync(Button button) 
    { 
     var buttonLoaded = Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
      h => new RoutedEventHandler(h), 
      h => button.Loaded += h, 
      h => button.Loaded -= h); 

     return button.IsLoaded 
      ? Observable.Return(Window.GetWindow(button)) 
      : buttonLoaded.Take(1).Select(_ => Window.GetWindow(button)); 
    } 

    private IObservable<IEvent<EventArgs>> GetWindowClosed(Window window) 
    { 
     return Observable.FromEvent<EventHandler, EventArgs>(
      h => new EventHandler(h), 
      h => window.Closed += h, 
      h => window.Closed -= h); 
    } 

    private IObservable<IEvent<RoutedEventArgs>> GetButtonClicked(Button button) 
    { 
     return Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
      h => new RoutedEventHandler(h), 
      h => button.Click += h, 
      h => button.Click -= h); 
    } 

    private IObservable<IEvent<RoutedEventArgs>> GetButtonUnloaded(Button button) 
    { 
     return Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
      h => new RoutedEventHandler(h), 
      h => button.Unloaded += h, 
      h => button.Unloaded -= h); 
    } 

    private void ClickButton(Button button) 
    { 
     ButtonAutomationPeer peer = 
      (ButtonAutomationPeer)UIElementAutomationPeer.CreatePeerForElement(button); 

     IInvokeProvider invokeProv = 
      peer.GetPattern(PatternInterface.Invoke) as IInvokeProvider; 

     invokeProv.Invoke(); 
    } 
} 
0

のAlt + F4は、たCloseCommand(RoutedUICommand、静的クラスApplicationCommandsからプロパティ)をトリガする必要があります。 このコマンドのCommandBindingを定義すると、それに反応する(つまり、StopCommandを呼び出すか他の方法で取り消す)ことができるはずです。そうでない場合、Windowはそれを処理して終了します。

これが不可能な場合は、(アプリケーションの起動時に)CloseCommandからKeyGesture Alt + F4を切り離して、キャンセルする他のアクションにマップすることができます。

+0

問題は、私のコードは 'Window'は、ボタンの完全に認識していない、ので、それらをリンクすることはできません作成しているということです。 –

関連する問題