Saturday, November 08, 2008

WindowsアプリケーションのフォームにはAcceptButtonとCancelButtonというプロパティがあります。

AcceptButton:フォームの[承諾]ボタンです。このプロパティを設定すると[Enter]が押されるたびに、ボタンがクリックされる。

CancelButton:フォームの[キャンセル]ボタンです。このプロパティを設定すると[Esc]が押されるたびに、ボタンがクリックされる。

WPFにおいてWindowsフォームに対応するものはWindowですが、AcceptButtonプロパティとCancelButtonを備えていません。

Windowsフォームのように[承諾]ボタンと[キャンセル]ボタンを実現するには、ButtonコントロールのIsDefaultやIsCancelプロパティを使用します。

IsDefaultプロパティ:プロパティウィンドウでこの項目にチェックを付けるかコードでtrueをセットすると、[Enter]キーが押されるたびにクリックされるようになります。

IsCancelプロパティ:プロパティウィンドウでこの項目にチェックを付けるかコードでtrueをセットすると、[Esc]キーが押されるたびにクリックされるようになります。

このプロパティは排他制御がされていないため、1つのボタンで[承諾]も[キャンセル]も行えるボタンを作成できてしまいます。またWindowsアプリケーションとは異なり、[承諾]と[キャンセル]を意味するプロパティがボタン自身が持つことにより、複数のボタンに[承諾]や[キャンセル]を割り当てることが出来てしまいます。

下記のようにボタンを2つ、テキストボックスを1つ配置して挙動を確かめてみます。

実験方法
フォーカスをテキストボックスに置いた状態で、[Enter]または[Esc]を押す。
(これはフォーカスがButton1 or Button2にある状態で[Enter]や[Esc]を押すのを防ぐためです)


1)Button1のIsDefaultとIsCancelにTrueをセット。Button2はIsDefault,IsCancelともにFalseをセット。
  [Enter]を押しても[Esc]を押しても、Button1のクリックイベントが発生。

2)Button1およびButton2の両方のIsDefaultにTrueをセット
 [Enter]を押すとButton1にフォーカスが当たるだけで、クリックイベントは発生しなかった。

3)Button1およびButton2の両方のIsCancelにTrueをセット
 [Esc]を押すとButton1にフォーカスが当たるだけで、クリックイベントは発生しなかった。

4)Button1のIsDefaultにTrue,IsCancelにFalse、Button2のIsDefaultにFalse,IsCancelにTrueをセット
[Enter]を押すとButton1のクリックイベントが発生。
[Esc]を押すとButton2のクリックイベントが発生。

まとめ
上記実験結果から、IsDefaultおよびIsCancelは
・1つのボタンに同時にセットしてはいけない
・複数のボタンに同一プロパティを設定してはいけないし
ということになります。

IsDefaultおよびIsCancelは組み合わせによっては正常に動作しないこともあるので注意が必要です。
なぜ、Windowsフォームのようにしなかったのか疑問ですね

WPF
Saturday, November 08, 2008 9:34:53 PM (Tokyo Standard Time, UTC+09:00)  #    Comments [0]  |  Trackback
Name
E-mail
Home page

Comment (Some html is allowed: a@href@title, strike) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Enter the code shown (prevents robots):

Live Comment Preview

Theme design by Jelle Druyts

Pick a theme: