Прямоугольник выбора не перемещается вместе с содержимым сетки данных WPF во время прокруткиC#

Место общения программистов C#
Ответить
Anonymous
 Прямоугольник выбора не перемещается вместе с содержимым сетки данных WPF во время прокрутки

Сообщение Anonymous »

Я пытаюсь воспроизвести поведение выбора проводника Windows в DataGrid WPF. В частности, я стремлюсь реализовать прямоугольник выбора, который имитирует функциональность механизма выбора Проводника. В настоящее время я создал прямоугольник-украшение, чтобы облегчить выбор предметов. Однако я столкнулся с проблемой при попытке выбрать строки во время прокрутки. Когда содержимое DataGrid прокручивается в его собственном ScrollViewer, строки, которые не пересекаются с прямоугольником выбора, отменяются, поскольку прямоугольник выбора является статическим и не перемещается вместе с содержимым datagrid во время прокрутки. Это похоже на то, что прямоугольник находится в воздухе, а не вставлен в сетку данных. Чтобы обеспечить более четкое понимание проблемы, я включил изображения ниже для справки.
Изображение

Я пробовал несколько решений, но ничего не помогло. Я ожидаю, что этот прямоугольник должен перемещаться вместе с содержимым сетки данных во время прокрутки, как мы видим в проводнике Windows.
`

































































































private void DataGrid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{

isleftbuttonpressed = true;

isSelecting = true;

selectionStartPoint = e.GetPosition(FileDataGrid);

adorner = new SelectionAdorner(FileDataGrid, selectionStartPoint);

var adornerLayer = AdornerLayer.GetAdornerLayer(FileDataGrid);

adornerLayer.Add(adorner);

adorner.SetStartPoint(selectionStartPoint);
}
private void DataGrid_PreviewMouseMove(object sender, MouseEventArgs e)

{

if (e.LeftButton == MouseButtonState.Pressed)

{

isleftbuttonpressed = true;

}

if (isSelecting && adorner != null)

{

adorner.SetEndPoint(e.GetPosition(FileDataGrid));

var selectionRect = adorner.GetSelectionRect();

SelectItemsInRectangle(selectionRect, FileDataGrid, sender, e);

}

private void SelectItemsInRectangle(Rect selectionRect, DataGrid dataGrid, object sender, MouseEventArgs e)

{

foreach (var item in dataGrid.Items)

{

var row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(item);

if (row != null)

{

var rowBounds = GetRowBoundsRelativeToDataGrid(row, dataGrid);

// Check if the row intersects with the selection rectangle

if (selectionRect.IntersectsWith(rowBounds))

{

// Select the item and add it to the collection of selected items

row.IsSelected = true;

}

else

{

row.IsSelected = false;

}

}

}
} `


Подробнее здесь: https://stackoverflow.com/questions/783 ... ing-scroll
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»