2

MonoMac を使用して、NSScrollView 内のスクロール位置 (水平および垂直) の読み取りと書き込みの両方を行いたいと考えています。スクロール位置を含むいくつかの異なる状態を保存してロードしたいので、これを行います。いくつかの異なる NSScrollViews を持つ代わりに、私は 1 つだけ持っていて、状態が変化するたびにそれを変更したいと考えています。

これまでのところ、NSScrollView の Horizo​​ntalScroller と VerticalScroller の DoubleValue に興味があることがわかりました。しかし、この値がいつ変化したかを検出して保存できるようにする方法を一生理解することはできません。ユーザーがスクロール バーをクリックするか、ドラッグするか、マウスまたはトラックパッドを使用するかに関係なく、変更を検出する必要があります。スクロールバーが動く限り、位置を保存したい。

助言がありますか?

4

2 に答える 2

3

あなたはこれに間違った方法でアプローチしていると思います。私の理解では、直接対話することはベストプラクティスではありませんNSScroller(また、これが機能するとは思いません)。

この質問への回答を参照してください。これは、あなたのシナリオに似ていると思います。最善の方法は、スクロール ビューの原点を設定することですContentView

その質問の答えをC#に変換しました:

public override void AwakeFromNib()
{
    tableView.EnclosingScrollView.ContentView.PostsBoundsChangedNotifications = true;
    NSNotificationCenter.DefaultCenter.AddObserver(this, new Selector("boundsDidChangeNotification"), 
    NSView.BoundsChangedNotification, tableView.EnclosingScrollView.ContentView);

    base.AwakeFromNib();
}

[Export("boundsDidChangeNotification")]
public void BoundsDidChangeNotification(NSObject o)
{
    var notification = o as NSNotification;
    var view = notification.Object as NSView;
    var position = view.Bounds.Location;
    Console.WriteLine("Scroll position: " + position.ToString());
} 

次のような特定のポイントまでスクロールできます。

PointF scrollTo = new PointF(19, 1571);
tableView.EnclosingScrollView.ContentView.ScrollToPoint(scrollTo);
tableView.EnclosingScrollView.ReflectScrolledClipView(tableView.EnclosingScrollView.ContentView);

これは興味深いかもしれません: Mac 用スクロール ビュー プログラミング ガイド

于 2013-07-15T13:40:50.950 に答える