0

ユーザーがスタックパネル内の要素をドラッグして、スタックパネル内の別の場所に再配置できるようにする方法について、優れたモデルがあります(私は思います!)。

ただし、私のStackpanelは、次のようにScrollViewer内に配置されます(一般化)。

<ScrollViewer>
   <StackPanel>
        ....First item
        ....Second item
        ....Third item
        ....Etc.
    </StackPanel>
<ScrollViewer>

ここに問題があります。Wordなどのプログラムの機能をシミュレートしたいと思います。選択したコンテンツ(またはオブジェクト)を表示可能領域の外にドラッグすると、ウィンドウがマウスの方向にスクロールして、ドロップする場所がさらに表示されます。気の利いた小さなオブジェクト。

...つまり、スタックパネルのコンテンツをドラッグしているときにマウスをScrollViewerの上部に移動すると、スクロールビューアーをゆっくりと上に移動して、コンテンツをドロップする場所をさらに表示できるようにします。

助言がありますか?

あなたが私がこれを解決するのを手伝ってくれるなら、あなたは天の恵みになるでしょう!

4

1 に答える 1

0

問題ない。DragOverレベルでルーティング イベントを処理しScrollViewerます。位置を取得します。ScrollViewer 境界の上部にある場合は、上にスクロールします。ScrollViewer 境界の下部にある場合は、下にスクロールします。

スクロール自体は、scrollViewer.LineUp()またはを呼び出すことによって行われscrollViewer.LineDown()ます。

イベントはDragOver頻繁に発生するため、またはDateTime.Nowを呼び出すたびに の値をフィールドに保存します。もう一度電話する前に確認し、十分な時間が経過していない場合は、またはを呼び出さないでください。LineUp()LineDown()DateTime.NowLineUp()LineDown()

スクロール速度をより適切に制御するには、とscrollViewer.ScrollToVerticalOffset(scrollViewer.ContentVerticalOffset + delta)の代わりに使用できます。scrollViewer.LineUp()scrollViewer.LineDown()

スクロール ビューアーの上部または下部に近づいたときに高速スクロールを許可すると、ユーザー エクスペリエンスが向上します。これは、スクロール領域をゾーンに分割するか、マウスの位置から速度を計算することで実行できます。この場合、速度の変更はLineUp()/LineDown()、エッジに近づいたときに複数回呼び出すか、delta使用している場合は値を増やすことで実行できますScrollToVerticalOffset。この目的のためにタイミング (DateTime.Now の比較) を変更することは、おそらく信頼できないため、変更しないでください。

于 2010-01-08T19:59:36.290 に答える