🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2341閲覧

Escキーイベントの発生の制御の方法 WPF

FacePanel

総合スコア48

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

0クリップ

投稿2020/01/01 15:02

いつもありがとうございます。
新年早々の質問です。

WPFの操作です。
例えば、コンボボックスでの選択位置の変更によるイベントの発生を制御するには
Combobox1.SelectionChanged += new SelectionChangedEventHandler(Combobox1_SelectionChanged);
Combobox1.SelectionChanged -= new SelectionChangedEventHandler(Combobox1_SelectionChanged);
で割合簡単にできます。

で、今回の質問は、以下です。
コンストラクターで
this.PreviewKeyDown += new KeyEventHandler(HandleEsc);
とし、
private void HandleEsc(object sender, KeyEventArgs e)
{
if (e.Key == Key.Escape)
{
this.Close();
}
}

で、可能になったEscキーでのWindowの閉じる操作を発生させないようにするには、どうしたらよいのでしょうか。
用語などに詳しくないために、うまく説明ができないことをお詫びいたします。

if文で閉じるかどうかを判断するのではなくて、最初の例のようにイベントを+=, -=などで制御するような方法が
ありましたら教えて下さい。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/01/01 15:19

if文を使わない理由は何ですか?
TN8001

2020/01/01 16:01

同じように this.PreviewKeyDown -= new KeyEventHandler(HandleEsc); で呼ばれなくなると思いますけど、ifで判定すること自体をどうにかしたいという意味ですか? ファイルを開くダイアログのようにモーダルなWindowの場合(ShowDialogしてる時)は <Button Content="Cancel" IsCancel="True"/> としておくだけでEscキーで勝手に閉じます。 モードレスなWindowの場合、閉じる操作は * タイトルバーの [閉じる] ボタン * Alt + F4 * [システム] メニューの [閉じる] * 独自に用意した閉じるボタン でEscキーで閉じるのは標準的なUIではないと思います。
FacePanel

2020/01/02 05:52

SelectionChangedEventHandler(Combobox1_SelectionChanged); という操作で、割合簡単にイベントの発生を制御できるので、 同様の方法もあろうかと思いまして、質問させていただきました。 ただ、そうした方法がないのだとすれば、if文で対応したいと思いますが、 やはりifが安全で簡単なのでしょうか。 もしも、+-での似たような方法があるかもしれないとなると、いつまでも 気になってしまいますので、よろしくお願い致します。
YAmaGNZ

2020/01/02 06:06

何がやりたいことなのか理解できません。 PreviewKeyDownを受けたくないのであれば、TN8001さんのおっしゃるようにイベントハンドラを削除すればいいだけですがそうじゃないようにも読み取れます。 また、あるタイミングのみイベントハンドラを無効としたいというのであれば、結局そこでif文で制御することになったりしませんか?
TN8001

2020/01/02 13:39

WindowにDataGrid等があり編集キャンセルなんかのEscは効かせたまま、それ以外の場合は閉じたいってことでしょうか?(深読みしすぎ?^^; のであれば単に this.KeyDown += (s, e) => { if(e.Key == Key.Escape) this.Close(); }; でそれっぽく動いてるような気がします。
Zuishin

2020/01/02 23:43

PreviewKeyDown はマルチキャストデリゲートなので同時に複数使うことができます。エスケープを処理するイベントハンドラと他のハンドラを分ければいいのではないでしょうか。
FacePanel

2020/01/03 03:07

皆様、大変お騒がせしました。 やっと、if文が最適と判断できました。なんか別の方法でもあるのかなと、気になってしまいましたので、変な質問となってしまいましたこと、お詫びさせていただきます。
Zuishin

2020/01/03 03:10

何がしたかったのかわからないので意味がわかりません。最適と判断できる材料もこちらにはありません。自己解決するのであれば、他人にわかるように丁寧に質問を書き直し、回答してください。
guest

回答1

0

自己解決

if文でよいとさせていただきました。
ありがとうございました。

投稿2020/01/03 03:08

FacePanel

総合スコア48

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/01/03 03:11

> if文で閉じるかどうかを判断するのではなくて、最初の例のようにイベントを+=, -=などで制御するような方法がありましたら教えて下さい。 質問の答えになっていません。
Zuishin

2020/01/03 21:15

言葉が通じない人なのかな?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問