1313using Microsoft . UI . Xaml . Controls ;
1414using Microsoft . UI . Xaml . Controls . Primitives ;
1515using Microsoft . UI . Xaml . Input ;
16+ using Microsoft . UI . Xaml . Media ;
1617using Microsoft . UI . Xaml . Navigation ;
1718using System ;
1819using System . Collections . Generic ;
@@ -33,12 +34,43 @@ public sealed partial class ColumnViewBase : BaseLayout
3334
3435 protected override ItemsControl ItemsControl => FileList ;
3536
37+ private ColumnViewBrowser ? columnsOwner ;
38+ private ListViewItem ? openedFolderPresenter ;
39+
3640 public ColumnViewBase ( ) : base ( )
3741 {
3842 this . InitializeComponent ( ) ;
3943 var selectionRectangle = RectangleSelection . Create ( FileList , SelectionRectangle , FileList_SelectionChanged ) ;
4044 selectionRectangle . SelectionEnded += SelectionRectangle_SelectionEnded ;
4145 tapDebounceTimer = DispatcherQueue . CreateTimer ( ) ;
46+ this . ItemInvoked += ColumnViewBase_ItemInvoked ;
47+ this . GotFocus += ColumnViewBase_GotFocus ;
48+ }
49+
50+ private void ColumnViewBase_GotFocus ( object sender , RoutedEventArgs e )
51+ {
52+ if ( FileList . SelectedItem == null && openedFolderPresenter != null )
53+ {
54+ openedFolderPresenter . Focus ( FocusState . Programmatic ) ;
55+ FileList . SelectedItem = FileList . ItemFromContainer ( openedFolderPresenter ) ;
56+ }
57+ }
58+
59+ private void ColumnViewBase_ItemInvoked ( object ? sender , EventArgs e )
60+ {
61+ ClearOpenedFolderSelectionIndicator ( ) ;
62+ openedFolderPresenter = FileList . ContainerFromItem ( FileList . SelectedItem ) as ListViewItem ;
63+ }
64+
65+ private void ClearOpenedFolderSelectionIndicator ( )
66+ {
67+ if ( openedFolderPresenter is null )
68+ return ;
69+
70+ openedFolderPresenter . Background = new SolidColorBrush ( Microsoft . UI . Colors . Transparent ) ;
71+ var presenter = openedFolderPresenter . FindDescendant < Grid > ( ) ! ;
72+ presenter ! . Background = new SolidColorBrush ( Microsoft . UI . Colors . Transparent ) ;
73+ openedFolderPresenter = null ;
4274 }
4375
4476 protected override void HookEvents ( )
@@ -148,7 +180,10 @@ protected override void UnhookEvents()
148180 protected override void OnNavigatedTo ( NavigationEventArgs eventArgs )
149181 {
150182 if ( eventArgs . Parameter is NavigationArguments navArgs )
183+ {
151184 navArgs . FocusOnNavigation = ( navArgs . AssociatedTabInstance as ColumnShellPage ) ? . ColumnParams ? . Column == 0 ; // Focus filelist only if first column
185+ columnsOwner = ( navArgs . AssociatedTabInstance as FrameworkElement ) ? . FindAscendant < ColumnViewBrowser > ( ) ;
186+ }
152187
153188 base . OnNavigatedTo ( eventArgs ) ;
154189
@@ -296,6 +331,7 @@ public override void Dispose()
296331 base . Dispose ( ) ;
297332 UnhookEvents ( ) ;
298333 CommandsViewModel ? . Dispose ( ) ;
334+ columnsOwner = null ;
299335 }
300336
301337 #endregion IDisposable
@@ -306,8 +342,21 @@ private async void FileList_SelectionChanged(object sender, SelectionChangedEven
306342
307343 if ( SelectedItems . Count == 1 && App . AppModel . IsQuickLookAvailable )
308344 await QuickLookHelpers . ToggleQuickLook ( ParentShellPageInstance , true ) ;
345+
346+ if ( e != null )
347+ {
348+ if ( e . AddedItems . Count > 0 )
349+ columnsOwner ? . HandleSelectionChange ( this ) ;
350+
351+ if ( e . RemovedItems . Count > 0 && openedFolderPresenter != null )
352+ {
353+ var presenter = openedFolderPresenter . FindDescendant < Grid > ( ) ! ;
354+ presenter ! . Background = this . Resources [ "ListViewItemBackgroundSelected" ] as SolidColorBrush ;
355+ }
356+ }
309357 }
310358
359+
311360 private void FileList_RightTapped ( object sender , RightTappedRoutedEventArgs e )
312361 {
313362 if ( ! IsRenamingItem )
@@ -404,6 +453,8 @@ private async void FileList_PreviewKeyDown(object sender, KeyRoutedEventArgs e)
404453
405454 var currentBladeIndex = ( ParentShellPageInstance is ColumnShellPage associatedColumnShellPage ) ? associatedColumnShellPage . ColumnParams . Column : 0 ;
406455 this . FindAscendant < ColumnViewBrowser > ( ) ? . MoveFocusToPreviousBlade ( currentBladeIndex ) ;
456+ FileList . SelectedItem = null ;
457+ ClearOpenedFolderSelectionIndicator ( ) ;
407458 e . Handled = true ;
408459 }
409460 else if ( e . Key == VirtualKey . Right ) // Right arrow: switch focus to next column
@@ -499,6 +550,7 @@ private void FileList_ItemTapped(object sender, TappedRoutedEventArgs e)
499550 var shiftPressed = InputKeyboardSource . GetKeyStateForCurrentThread ( VirtualKey . Shift ) . HasFlag ( CoreVirtualKeyStates . Down ) ;
500551 var item = ( e . OriginalSource as FrameworkElement ) ? . DataContext as ListedItem ;
501552
553+
502554 // Allow for Ctrl+Shift selection
503555 if ( ctrlPressed || shiftPressed )
504556 return ;
@@ -568,5 +620,10 @@ protected override void BaseFolderSettings_LayoutModeChangeRequested(object send
568620 break ;
569621 }
570622 }
623+
624+ internal void ClearSelectionIndicator ( )
625+ {
626+ FileList . SelectedItem = null ;
627+ }
571628 }
572629}
0 commit comments