Связанный с данными WPF ListView Перетаскивает/Отбрасывает Автоматическую Прокрутку

Итак, вам нужно DELETE связать строки из конфликтующих таблиц или более логично UPDATE их столбец FOREIGN KEY для ссылки на другие PRIMARY KEY из родительской таблицы.

Кроме того, вы можете прочитать эту статью Не удаляйте - просто не делайте

7
задан ScottN 18 February 2009 в 02:20
поделиться

3 ответа

Я все еще пытаюсь решить эту же проблему. Я использую слегка измененную версию перетаскивания Bea's Drag and Drop, найденную здесь , которая находится на VB вместо C #. Когда я использовал ScrollIntoView, как описано выше, я мог прокручивать вниз, но не вверх. Так что я напортачил и придумал это как мой DropTarget_PreviewDragOver:

 Private Sub DropTarget_PreviewDragOver(ByVal sender As Object, ByVal e As DragEventArgs)
        Dim draggedItem As Object = e.Data.GetData(Me.m_format.Name)
        Me.DecideDropTarget(e)
        If (Not draggedItem Is Nothing) Then
            If (TypeOf m_targetItemsControl Is ListBox) Then
                Dim lb As ListBox = CType(m_targetItemsControl, ListBox)
                Dim temp As Integer = m_insertionIndex
                Dim scroll As ScrollViewer = Utilities.GetScrollViewer(lb)
                If scroll.VerticalOffset = temp Then
                    temp -= 1
                End If
                If temp >= 0 And temp <= (lb.Items.Count - 1) Then
                    lb.ScrollIntoView(lb.Items(temp))
                End If
            End If
            Me.ShowDraggedAdorner(e.GetPosition(Me.m_topWindow))
            Me.UpdateInsertionAdornerPosition()
        End If
        e.Handled = True
    End Sub

, и мне пришлось включить эту служебную функцию, взятую из здесь

    Public Shared Function GetScrollViewer(ByVal listBox As ListBox)
    Dim scroll_border As Decorator = CType(VisualTreeHelper.GetChild(listBox, 0), Decorator)
    If (TypeOf scroll_border Is Decorator) Then
        Dim scroll As ScrollViewer = CType(scroll_border.Child, ScrollViewer)
        If (TypeOf scroll Is ScrollViewer) Then
            Return scroll
        Else
            Return Nothing
        End If
    Else
        Return Nothing
    End If


End Function

, и это здорово и все такое. Затем выполнив то, что упомянул вышеупомянутый туберк, с перемещением украшения, и в духе того, чтобы облегчить это для кого-то еще, я добавил переменную в класс DragDropAdorner:

    Private m_mouseDelta As Point

Добавил это в последнюю строку DragSource_PreviewMouseLeftButtonDown:

        Me.m_mouseDelta = e.GetPosition(m_sourceItemContainer)

И превратил ShowDraggedAdorner в:

    Private Sub ShowDraggedAdorner(ByVal currentPosition As Point)
    If (Me.m_draggedAdorner Is Nothing) Then
        Dim adornerLayer As AdornerLayer = adornerLayer.GetAdornerLayer(Me.m_topWindow.Content)
        Me.m_draggedAdorner = New DraggedAdorner(Me.m_draggedData, DragDropBehavior.GetDragTemplate(Me.m_sourceItemsControl), m_topWindow.Content, adornerLayer)
    End If
    Me.m_draggedAdorner.SetPosition((currentPosition.X - m_mouseDelta.X), (currentPosition.Y - m_mouseDelta.Y))
    End Sub
2
ответ дан 7 December 2019 в 14:38
поделиться

Я воспользовался преимуществом метода ListBox.ScrollIntoView . В принципе, когда вы обновляете цель перетаскивания, вы можете просто вызвать для нее этот метод, и wpf сделает всю работу. Все, что вам нужно знать, это индекс целевого элемента перетаскивания. Это обрабатывает как вертикальную, так и горизонтальную прокрутку.

this.listView.ScrollIntoView (this.listView.Items [index]);

Когда вы используете этот метод, ваш украшение может перемещаться вместе с прокручивающимся ListBox. Чтобы исправить это, я просто установил свой родительский элемент украшения и родительский слой слоя украшения на содержимое окна в верхней части визуального дерева (например, topWindow.Content ).

2
ответ дан 7 December 2019 в 14:38
поделиться

Другой возможностью прокрутки является использование ScrollBar-Commands. Вы можете сделать это, не спускаясь по VisualTree. Если у вас есть ListBox стилей без границы, GetScrollViewer () - Method больше не будет работать.

Я использую первый элемент ItemContainerGenerator как CommandTarget для ScrollBar.LineXXXCommand:

Point p = e.GetPosition(itemsControl);
  IInputElement commandTarget = itemsControl.ItemContainerGenerator.ContainerFromIndex(0) as IInputElement;

  if (commandTarget != null)
  {
    if (p.Y < OFFSET_TO_SCROLL)
      ScrollBar.LineUpCommand.Execute(null, commandTarget);
    else if (p.Y > itemsControl.ActualHeight - OFFSET_TO_SCROLL)
      ScrollBar.LineDownCommand.Execute(null, commandTarget);

    if (p.X < OFFSET_TO_SCROLL)
      ScrollBar.LineLeftCommand.Execute(null, commandTarget);
    else if (p.X > itemsControl.ActualWidth - OFFSET_TO_SCROLL)
      ScrollBar.LineRightCommand.Execute(null, commandTarget);
  }

Вызов LineXXXCommands аналогичен нажатию кнопок со стрелками на ScrollBar: ScrollViewer прокручивает определенное количество, которое вы можете настроить, установив Свойство SmallAmount полосы прокрутки.

0
ответ дан 7 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: