差分

ナビゲーションに移動 検索に移動
ページの作成:「NSTextFieldでリターンキーが押された際に処理をしたいことも多いと思う。 キーボードマウスをいったりきたりするUI...」
NSTextFieldで[[リターンキー]]が押された際に処理をしたいことも多いと思う。
[[キーボード]]と[[マウス]]をいったりきたりするUIとか止めてほしいと思っている人も多いはず。

ちなみに[[Mac]]では宗教上の理由により[[キーボード]]のメイン部分にある大きいのが[[リターンキー]]で、[[テンキー]]に付いている小さいのが[[エンターキー]]と区別するらしぞ。

==実装1==
リターンキーであれば何も考える必要はない。
リターンキーが押されたり、フォーカスが外れたりすると以下のイベントが順番に発生する。イベント設定はどちらでもいいと思う。
* EditingEndedイベント
* Activatedイベント

<source lang="csharp">
public override void AwakeFromNib()
{
base.AwakeFromNib();

textbox.EditingEnded += (sender,e) => Console.WriteLine("EditingEnded");
textbox.Activated += (sender, e) => Console.WriteLine("Activated");
}
</source>

==実装2==
実装1はフォーカスが外れた際に処理が走ってしまい微妙に不便だったりする。たとえばブラウザの検索窓などでは[[リターンキー]]で検索を実行し、フォーカスがはずれただけの場合は何もしないというものが多い。DoCommandBySelectorを使うとどういう理由で編集を終わろうとしているかを検出できるようだ<ref>https://github.com/xamarin/mac-samples/blob/master/SearchField/SearchFieldWindowController.cs</ref>。

<source lang="csharp">
public override void AwakeFromNib()
{
base.AwakeFromNib();

textbox.EditingEnded += (sender,e) => Console.WriteLine("EditingEnded");
textbox.Activated += (sender, e) => Console.WriteLine("Activated");

textbox.DoCommandBySelector = (NSControl control, NSTextView textView, Selector commandSelector) => {
if (commandSelector.Name == "insertNewline:")
{
// ここにリターンキーが押された時の処理を書く

// リターンキーが押された時の終了処理。
// これでEditingEndedイベントが飛ぶ。
textView.PerformSelector(sel:commandSelector, obj:null, delay:-1);
return true;
}
return false;
};
}
</source>

==関連項目==

==参考文献==
{{reflist}}

{{stub}}

[[category:MonoMac]]
匿名利用者

案内メニュー