はそれがAltキー + F4(だけでなく、X
閉じるボタン+ <system menu> :: Close
)を持つことが可能ですIsCancel
としてマークされているボタンをトリガ? Escキーを押すのと同じ方法で動作させたいと思います。ALT + F4とIsCancelボタン
注:私はプリズムを使用していますし、ダイアログがRegionBehavior
で作成されているので、私は直接ボタンにアクセスすることはできません
はそれがAltキー + F4(だけでなく、X
閉じるボタン+ <system menu> :: Close
)を持つことが可能ですIsCancel
としてマークされているボタンをトリガ? Escキーを押すのと同じ方法で動作させたいと思います。ALT + F4とIsCancelボタン
注:私はプリズムを使用していますし、ダイアログがRegionBehavior
で作成されているので、私は直接ボタンにアクセスすることはできません
私はこれをカスタム動作でサポートしました。そのコードは以下のとおりです。私は、誰かが考えることができれば、よりクリーンな実装(たとえば、ボタンにビヘイビアを追加する必要はありません)に切り替えることができます。
(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();
}
}
のAlt + F4は、たCloseCommand(RoutedUICommand、静的クラスApplicationCommandsからプロパティ)をトリガする必要があります。 このコマンドのCommandBindingを定義すると、それに反応する(つまり、StopCommandを呼び出すか他の方法で取り消す)ことができるはずです。そうでない場合、Windowはそれを処理して終了します。
これが不可能な場合は、(アプリケーションの起動時に)CloseCommandからKeyGesture Alt + F4を切り離して、キャンセルする他のアクションにマップすることができます。
問題は、私のコードは 'Window'は、ボタンの完全に認識していない、ので、それらをリンクすることはできません作成しているということです。 –