Skip to content

Commit a06aafc

Browse files
authored
Fix: Fixed crash that could occur when dragging in grouped grid layout (#14654)
1 parent e0ca27b commit a06aafc

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

src/Files.App/Views/Layouts/BaseLayoutPage.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,7 @@ protected virtual void Page_CharacterReceived(UIElement sender, CharacterReceive
958958
}
959959
}
960960

961-
protected void FileList_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
961+
protected virtual void FileList_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
962962
{
963963
try
964964
{
@@ -1094,7 +1094,7 @@ private async void Item_DragOver(object sender, DragEventArgs e)
10941094
}
10951095
}
10961096

1097-
private async void Item_Drop(object sender, DragEventArgs e)
1097+
protected virtual async void Item_Drop(object sender, DragEventArgs e)
10981098
{
10991099
var deferral = e.GetDeferral();
11001100

@@ -1282,7 +1282,7 @@ protected void ItemsLayout_DragOver(object sender, DragEventArgs e)
12821282
CommandsViewModel?.DragOverCommand?.Execute(e);
12831283
}
12841284

1285-
protected void ItemsLayout_Drop(object sender, DragEventArgs e)
1285+
protected virtual void ItemsLayout_Drop(object sender, DragEventArgs e)
12861286
{
12871287
CommandsViewModel?.DropCommand?.Execute(e);
12881288
}

src/Files.App/Views/Layouts/GridLayoutPage.xaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -819,7 +819,9 @@
819819
CanDragItems="{x:Bind AllowItemDrag, Mode=OneWay}"
820820
ContainerContentChanging="FileList_ContainerContentChanging"
821821
DoubleTapped="FileList_DoubleTapped"
822+
DragEnter="ItemsLayout_DragEnter"
822823
DragItemsStarting="FileList_DragItemsStarting"
824+
DragLeave="ItemsLayout_DragLeave"
823825
DragOver="ItemsLayout_DragOver"
824826
Drop="ItemsLayout_Drop"
825827
FocusVisualPrimaryThickness="0"

src/Files.App/Views/Layouts/GridLayoutPage.xaml.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,47 @@ private void SelectionCheckbox_PointerCanceled(object sender, PointerRoutedEvent
639639
UpdateCheckboxVisibility((sender as FrameworkElement)!.FindAscendant<GridViewItem>()!, false);
640640
}
641641

642+
// To avoid crashes, disable scrolling when drag-and-drop if grouped. (#14484)
643+
protected override void FileList_DragItemsStarting(object sender, DragItemsStartingEventArgs e)
644+
{
645+
if (ParentShellPageInstance?.FilesystemViewModel.FilesAndFolders.IsGrouped ?? false)
646+
ScrollViewer.SetVerticalScrollMode(FileList, ScrollMode.Disabled);
647+
648+
base.FileList_DragItemsStarting(sender, e);
649+
650+
if (ParentShellPageInstance?.FilesystemViewModel.FilesAndFolders.IsGrouped ?? false &&
651+
e.Cancel)
652+
ScrollViewer.SetVerticalScrollMode(FileList, ScrollMode.Auto);
653+
}
654+
655+
private void ItemsLayout_DragEnter(object sender, DragEventArgs e)
656+
{
657+
if (ParentShellPageInstance?.FilesystemViewModel.FilesAndFolders.IsGrouped ?? false)
658+
ScrollViewer.SetVerticalScrollMode(FileList, ScrollMode.Disabled);
659+
}
660+
661+
private void ItemsLayout_DragLeave(object sender, DragEventArgs e)
662+
{
663+
if (ParentShellPageInstance?.FilesystemViewModel.FilesAndFolders.IsGrouped ?? false)
664+
ScrollViewer.SetVerticalScrollMode(FileList, ScrollMode.Auto);
665+
}
666+
667+
protected override void ItemsLayout_Drop(object sender, DragEventArgs e)
668+
{
669+
if (ParentShellPageInstance?.FilesystemViewModel.FilesAndFolders.IsGrouped ?? false)
670+
ScrollViewer.SetVerticalScrollMode(FileList, ScrollMode.Auto);
671+
672+
base.ItemsLayout_Drop(sender, e);
673+
}
674+
675+
protected override void Item_Drop(object sender, DragEventArgs e)
676+
{
677+
if (ParentShellPageInstance?.FilesystemViewModel.FilesAndFolders.IsGrouped ?? false)
678+
ScrollViewer.SetVerticalScrollMode(FileList, ScrollMode.Auto);
679+
680+
base.Item_Drop(sender, e);
681+
}
682+
642683
private void UpdateCheckboxVisibility(object sender, bool isPointerOver)
643684
{
644685
if (sender is GridViewItem control && control.FindDescendant<UserControl>() is UserControl userControl)

0 commit comments

Comments
 (0)