Перетаскиваемый холст в WPF с помощью большого пальца - PullRequest
5 голосов
/ 23 августа 2010

В моем стремлении реализовать очень простой механизм «перетаскивания» в мое приложение (которое состоит из нескольких холстов, вложенных в «родительский» холст), я пришел к следующему фрагменту кода:

(Отображаются только соответствующие биты для экономии места)

MainWindow.xaml

    <Canvas Name="parentCanvas" Background="#FFE8CACA">
        <Canvas Name="myCanvas" Height="100" Width="200" Background="#FFB4FFB4">
            <Thumb Name="myThumb" Canvas.Left="0" Canvas.Top="0" Background="Blue" Width="200" Height="20" DragDelta="onDragDelta" />
        </Canvas>

        <!-- debug -->
        <Button Content="Zero" Height="51" Name="button1" Width="46" Click="button1_Click" Canvas.Left="14" Canvas.Top="302" />
        <Label Name="pos" Width="499" Canvas.Left="77" Canvas.Top="302" Height="26" />
        <Label Name="changes" Height="28" Canvas.Left="77" Canvas.Top="325" Width="499" />
    </Canvas>

MainWindow.xaml.cs

    void onDragDelta(object sender, DragDeltaEventArgs e)
    {
        Canvas.SetLeft(myCanvas, e.HorizontalChange);
        Canvas.SetTop(myCanvas, e.VerticalChange);

        //debug info
        pos.Content = "Left: " + Canvas.GetLeft(myCanvas) + ", Top: " + Canvas.GetTop(myCanvas);
        changes.Content = "Horizontal: " + e.HorizontalChange + ", Vertical: " + e.VerticalChange;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        Canvas.SetLeft(myCanvas, 0);
        Canvas.SetTop(myCanvas, 0);
    }

Кажется, что работает, случайно!Кажется, что он следует за движениями мыши, но у меня возникают проблемы с интерпретацией DragDeltaEventArgs, которая вызывает очень неустойчивое движение холста.Это сложно объяснить, поэтому вот короткое видео, которое я снял: http://img84.imageshack.us/img84/6614/drag.mp4

Любые комментарии / предложения будут высоко оценены, так как я смотрю на это некоторое время и могуне могу понять, что с этим делать: (

1 Ответ

4 голосов
/ 23 августа 2010

Горизонтальные и вертикальные изменения - это сумма, перемещенная с момента предыдущего события, поэтому вам необходимо добавить их в текущую позицию.

Canvas.SetLeft(myCanvas, Canvas.GetLeft(myCanvas) + e.HorizontalChange);
Canvas.SetTop(myCanvas, Canvas.GetTop(myCanvas) + e.VerticalChange);

Вам также необходимо установить начальную позицию для холста, иначе вы получите NaN.

<Canvas Name="myCanvas" Height="100" Width="200" Background="#FFB4FFB4" Canvas.Left="0" Canvas.Top="0">
...