「Xamarin.MacでNSTextField内でリターンキーが押された際に処理をする」の版間の差分
ナビゲーションに移動
検索に移動
(→実装2) |
imported>Administrator 細 (Administrator がページ「Xamarin.Mac/NSTextFieldでリターンキーが押された際に処理をする」を「Xamarin.MacでNSTextField内でリターンキーが押された際に処理をする」に移動しました) |
||
(同じ利用者による、間の4版が非表示) | |||
1行目: | 1行目: | ||
− | NSTextFieldで[[リターンキー]] | + | NSTextFieldで[[リターンキー]]([[エンターキー]])が押された際に処理をしたいことも多いと思う。[[キーボード]]と[[マウス]]をいったりきたりする[[UI]]とか止めてほしいと思っている人も多いはず。 |
− | [[キーボード]]と[[マウス]] | + | ちなみに[[Mac]]では宗教上の理由により、[[キーボード]]のメイン部分にある大きいのが[[リターンキー]]で、[[テンキー]]に付いている小さいのが[[エンターキー]]と区別するらしぞ。 |
− | + | == 実装1 == | |
− | |||
− | ==実装1== | ||
リターンキーであれば何も考える必要はない。 | リターンキーであれば何も考える必要はない。 | ||
リターンキーが押されたり、フォーカスが外れたりすると以下のイベントが順番に発生する。イベント設定はどちらでもいいと思う。 | リターンキーが押されたり、フォーカスが外れたりすると以下のイベントが順番に発生する。イベント設定はどちらでもいいと思う。 | ||
20行目: | 18行目: | ||
</source> | </source> | ||
− | ==実装2== | + | == 実装2 == |
実装1はフォーカスが外れた際に問答無用で処理が走ってしまい微妙に不便だったりする。たとえば[[ウェブブラウザ]]の検索窓などでは[[リターンキー]]で検索を実行し、フォーカスがはずれただけの場合は何もしないというものが多い。これに対応するにはDoCommandBySelectorを使うとどういう理由で編集を終わろうとしているかを検出できるようだ<ref>https://github.com/xamarin/mac-samples/blob/master/SearchField/SearchFieldWindowController.cs</ref>。 | 実装1はフォーカスが外れた際に問答無用で処理が走ってしまい微妙に不便だったりする。たとえば[[ウェブブラウザ]]の検索窓などでは[[リターンキー]]で検索を実行し、フォーカスがはずれただけの場合は何もしないというものが多い。これに対応するにはDoCommandBySelectorを使うとどういう理由で編集を終わろうとしているかを検出できるようだ<ref>https://github.com/xamarin/mac-samples/blob/master/SearchField/SearchFieldWindowController.cs</ref>。 | ||
46行目: | 44行目: | ||
</source> | </source> | ||
− | ==関連項目== | + | == 関連項目 == |
+ | * [[Xamarin.iOS/UIControl派生物にフォーカスを当てる]] | ||
+ | * [[Xamarin.Mac/NSTextFieldクラス]] | ||
+ | * [[Xamarin.Mac/NSTokenFieldクラス]] | ||
− | ==参考文献== | + | == 参考文献 == |
{{reflist}} | {{reflist}} | ||
− | |||
− | |||
[[category:MonoMac]] | [[category:MonoMac]] | ||
+ | [[category:Xamarin.Mac]] |
2019年5月22日 (水) 05:12時点における最新版
NSTextFieldでリターンキー(エンターキー)が押された際に処理をしたいことも多いと思う。キーボードとマウスをいったりきたりするUIとか止めてほしいと思っている人も多いはず。 ちなみにMacでは宗教上の理由により、キーボードのメイン部分にある大きいのがリターンキーで、テンキーに付いている小さいのがエンターキーと区別するらしぞ。
実装1[編集 | ソースを編集]
リターンキーであれば何も考える必要はない。 リターンキーが押されたり、フォーカスが外れたりすると以下のイベントが順番に発生する。イベント設定はどちらでもいいと思う。
- EditingEndedイベント
- Activatedイベント
public override void AwakeFromNib()
{
base.AwakeFromNib();
textbox.EditingEnded += (sender,e) => Console.WriteLine("EditingEnded");
textbox.Activated += (sender, e) => Console.WriteLine("Activated");
}
実装2[編集 | ソースを編集]
実装1はフォーカスが外れた際に問答無用で処理が走ってしまい微妙に不便だったりする。たとえばウェブブラウザの検索窓などではリターンキーで検索を実行し、フォーカスがはずれただけの場合は何もしないというものが多い。これに対応するにはDoCommandBySelectorを使うとどういう理由で編集を終わろうとしているかを検出できるようだ[1]。
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;
};
}