3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Using NSTextView in Xamarin.Mac

Posted at

##tl;dr
###テキストを追加する

textView.InsertText("foo");

###スクロールする

// 末尾にスクロール
var range = new NSRange(textView.Value.Length, 0);
textView.ScrollRangeToVisible(range);

##NSTextView in Xamarin.Mac
NSTextFieldは単一行,NSTextViewはもうちょっと高度な編集UIを提供するという認識で大丈夫かと。
NSTextView->NSTextContainer->NSLayoutManager->NSTextStorage,従ってテキスト操作はNSTextStorageをいじっていくことになる。
本稿ではよく使うであろう,文字列の挿入とスクロール状態の変更について記しておきたい。よく忘れるので。

##Insert
テキストを挿入するのは簡単。

textView.InsertText("foo");

現在のカーソル位置に挿入される。ので,末尾に追加したければカーソル位置を末尾に移動すればよい。

Append
var wholeRange = new NSRange(StatusLabel.Value.Length, 0);
textView.SetSelectedRange(wholeRange);
textView.InsertText("bar");

InsertTextは,ユーザーが入力したのと同じ扱いであるため,IsEditable==true時にしか利用できない。
先述のとおり,本来は下記のようにNSTextStorageを操作する。これはIsEditableプロパティに影響されない。

NSTextStorage
var stor = textView.TextStorage;
stor.BeginEditing();
// 末尾に追加
stor.Append(new NSAttributedString("foo"));
// インデックスを指定して挿入
stor.Insert(new NSAttributedString("bar"), 0);
stor.EndEditing();

内部ではNSAttributedStringをブロックとして持っているので,このブロック毎にインデックスが振られている。
詳細は割愛するが,NSAttributedStringはリッチテキストなので,NSStringAttributesを指定すれば前景色など装飾要素を設定できる。たとえば背景色を青くするなら,

var s = new NSAttributedString("blue", new NSStringAttributes{BackgroundColor = NSColor.Blue});

##Scroll
ScrollRangeToVisibleを呼ぶだけ。Rangeは表示したい文字列が含まれる範囲。要は指定したカーソル位置がビューの最下行にくるように,うまいことスクロールするというメソッド。
末尾に移動するならこんな感じになる。

ScrollToEnd
textView.ScrollRangeToVisible(new NSRange(textView.Value.Length, 0));

##Conclusion
選択されている矩形を取得したり,テキストの装飾要素をコントロールしやすかったりと高機能なので,慣れてくるとなかなか使いどころの多いニクいやつ。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?