3

わかりました、私はこの問題について狂ったように頭をかきむしっていて、それがどのように機能するかを調査するためにかなりの時間を費やしましたが、まだ答えを見つけていません.

基本的に私が抱えている問題は、アプリケーションにフォルダーのツリービューがあることです。

Catalog

  Brands
    Nike
    Adidas
    Lactose


  Styles
    Sandles
    Trainers
    Boots

私が修正しようとしている問題は、フォルダーをドラッグすると (これは私の DragDropManager クラスで処理されます)、上下にスクロールできません (単に素敵な一時停止の標識が表示されるだけです)。

一番上から一番下に何かを移動したい場合、これは問題です。

スクロールはドラッグしなくても問題なく動作します。

誰かが私のコードの一部を見たい場合は、実際に何を見せればよいかわからないので、お気軽にお尋ねください。

私はかなりの数の記事を読みましたが、頭を悩ませているだけです。

4

1 に答える 1

2

より良いアプローチがあるかもしれませんが、私がやったことは次のとおりです。

  • ターゲット要素 (QueryContinueDrag) をドラッグしているときに、現在のコントロールのビジュアル ツリーに scrollviewer があるかどうかを確認します。

  • ここで、スクロールビューアの端に近いかどうかを確認します。たとえば、10px 離れています。

  • スクロールビューアをスクロールする

ここにいくつかのコードがあります:

関連する ScrollViewer を検索します。

var _scrollViewerControl = FindVisualChild<ScrollViewer>(treeView);

private childItem FindVisualChild<childItem>(DependencyObject obj)
where childItem : DependencyObject
{
  for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
  {
    DependencyObject child = VisualTreeHelper.GetChild(obj, i);
    if (child != null && child is childItem)
      return (childItem)child;
    else
    {
      childItem childOfChild = FindVisualChild<childItem>(child);
      if (childOfChild != null)
        return childOfChild;
    }
  }
  return null;
}

QueryContinueDrag で、現在の位置とスクロールビューアーへのデルタを決定します。

// as we don't have eventargs here exposing the current mouse position we use the
// win32 API to get the current mouse position
Win32.POINT p;
if (!Win32.GetCursorPos(out p))
{
    return;
}

//this is the point on the screen
Point point = new Point(p.X, p.Y);

//get position relative to scrollViewerControl
Point controlPoint = _scrollViewerControl.PointFromScreen(point);

if (controlPoint.Y < 10 && -10 < controlPoint.Y)
{
    _scrollViewerControl.LineUp();
}
else if (controlPoint.Y > _scrollViewerControl.ViewportHeight - 10 && _scrollViewerControl.ViewportHeight + 10 > controlPoint.Y)
{
    _scrollViewerControl.LineDown();
}

if (controlPoint.X < 10 && -10 < controlPoint.X)
{
    _scrollViewerControl.LineLeft();
}
else if (controlPoint.X > _scrollViewerControl.ViewportWidth - 10 && _scrollViewerControl.ViewportWidth + 10 > controlPoint.X)
{
    _scrollViewerControl.LineRight();
}
于 2012-05-23T13:51:25.947 に答える