Симуляция визуального перетаскивания (что не так с этим кодом?) - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть проект WPF 4 / VB.net 2010, и я пытаюсь сделать визуальное «перетаскивание» (объект следит за мышью при MouseUp и «прилипает» при MouseDown.) У меня есть следующее код позади:

Private Sub Tile1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Tile1.MouseDown
    Tile1.CaptureMouse()
    IsDragging = True
End Sub

Private Sub Tile1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Tile1.MouseMove
    If IsDragging = True Then
        Dim canvPosToWindow As Point = canv.TransformToAncestor(Me).Transform(New Point(0, 0))

        Dim r As Rectangle = TryCast(sender, Rectangle)
        Dim upperlimit As Double = canvPosToWindow.Y + (r.Height / 2)
        Dim lowerlimit As Double = canvPosToWindow.Y + canv.ActualHeight - (r.Height / 2)

        Dim leftlimit As Double = canvPosToWindow.X + (r.Width / 2)
        Dim rightlimit As Double = canvPosToWindow.X + canv.ActualWidth - (r.Width / 2)

        Dim absmouseXpos As Double = e.GetPosition(Me).X
        Dim absmouseYpos As Double = e.GetPosition(Me).Y

        If (absmouseXpos > leftlimit AndAlso absmouseXpos < rightlimit) AndAlso (absmouseYpos > upperlimit AndAlso absmouseYpos < lowerlimit) Then
            r.SetValue(Canvas.LeftProperty, e.GetPosition(canv).X - (r.Width / 2))
            r.SetValue(Canvas.TopProperty, e.GetPosition(canv).Y - (r.Height / 2))
        End If
    End If
End Sub

Private Sub Tile1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Input.MouseButtonEventArgs) Handles Tile1.MouseUp
    Tile1.ReleaseMouseCapture()
    IsDragging = False
End Sub

Я получаю эту ошибку:

NullReferenceException, ссылка на объект не установлена ​​для экземпляра объекта.

В каждой из следующих строк:

 Dim upperlimit As Double = canvPosToWindow.Y + (r.Height / 2)
 Dim lowerlimit As Double = canvPosToWindow.Y + canv.ActualHeight - (r.Height / 2)

 Dim leftlimit As Double = canvPosToWindow.X + (r.Width / 2)
 Dim rightlimit As Double = canvPosToWindow.X + canv.ActualWidth - (r.Width / 2)

Что я делаю не так?

1 Ответ

1 голос
/ 16 апреля 2011

Я подозреваю, что это утверждение делает r "нулевым" и не правильным прямоугольником.

Dim r As Rectangle = TryCast(sender, Rectangle)

Отправитель, вероятно, не прямоугольник, а, вероятно, WPF-Control (некоторый подкласс System.Windows.Controls.Control).

Вы можете легко проверить с помощью отладчика Visual Studio, поместив точку отладки в эту строку и посмотреть, оценивает ли этот оператор.

Удачи в реализации перетаскивания:.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...