diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.cs index 2541bbf9896a..d7d86ce2c38b 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBar.cs @@ -2,6 +2,7 @@ // Licensed under the MIT License. using Microsoft.UI.Xaml.Automation; +using Microsoft.UI.Xaml.Input; using Windows.Foundation; namespace Files.App.Controls @@ -67,10 +68,10 @@ protected override void OnApplyTemplate() _itemsRepeater.ItemsSourceView.CollectionChanged += ItemsSourceView_CollectionChanged; } - internal protected virtual void RaiseItemClickedEvent(BreadcrumbBarItem item) + internal protected virtual void RaiseItemClickedEvent(BreadcrumbBarItem item, PointerRoutedEventArgs? pointerRoutedEventArgs = null) { var index = _itemsRepeater?.GetElementIndex(item) ?? throw new ArgumentNullException($"{_itemsRepeater} is null."); - var eventArgs = new BreadcrumbBarItemClickedEventArgs(item, index, item == _rootBreadcrumbBarItem); + var eventArgs = new BreadcrumbBarItemClickedEventArgs(item, index, item == _rootBreadcrumbBarItem, pointerRoutedEventArgs); ItemClicked?.Invoke(this, eventArgs); } diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs index 3e067946cf4f..b12682d13a77 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.Events.cs @@ -8,11 +8,6 @@ namespace Files.App.Controls { public partial class BreadcrumbBarItem { - private void ItemContentButton_Click(object sender, RoutedEventArgs e) - { - OnItemClicked(); - } - private void ItemChevronButton_Click(object sender, RoutedEventArgs e) { FlyoutBase.ShowAttachedFlyout(_itemChevronButton); diff --git a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs index e7ba940b0153..31760eddde44 100644 --- a/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs +++ b/src/Files.App.Controls/BreadcrumbBar/BreadcrumbBarItem.cs @@ -1,6 +1,9 @@ // Copyright (c) Files Community // Licensed under the MIT License. +using Microsoft.UI.Input; +using Microsoft.UI.Xaml.Input; + namespace Files.App.Controls { public partial class BreadcrumbBarItem : ContentControl @@ -46,7 +49,16 @@ protected override void OnApplyTemplate() if (IsEllipsis || IsLastItem) VisualStateManager.GoToState(this, "ChevronCollapsed", true); - _itemContentButton.Click += ItemContentButton_Click; + // Handle click event with PointerReleasedEvent to get PointerPoint + _itemContentButton.AddHandler( // Bypass "IsHandled = true" done in the base class + PointerReleasedEvent, + new PointerEventHandler((s, e) => + { + OnItemClicked(e); + e.Handled = true; + }), + handledEventsToo: true); + _itemContentButton.PreviewKeyDown += ItemContentButton_PreviewKeyDown; _itemChevronButton.Click += ItemChevronButton_Click; _itemChevronButton.PreviewKeyDown += ItemChevronButton_PreviewKeyDown; @@ -55,7 +67,7 @@ protected override void OnApplyTemplate() _itemChevronDropDownMenuFlyout.Closed += ChevronDropDownMenuFlyout_Closed; } - public void OnItemClicked() + public void OnItemClicked(PointerRoutedEventArgs? pointerRoutedEventArgs = null) { if (_ownerRef is null || !_ownerRef.TryGetTarget(out var breadcrumbBar)) @@ -73,7 +85,7 @@ public void OnItemClicked() { var menuFlyoutItem = new MenuFlyoutItem() { Text = text }; _itemEllipsisDropDownMenuFlyout.Items.Add(menuFlyoutItem); - menuFlyoutItem.Click += (sender, e) => breadcrumbBar.RaiseItemClickedEvent(item); + menuFlyoutItem.Click += (sender, e) => breadcrumbBar.RaiseItemClickedEvent(item, pointerRoutedEventArgs); } } @@ -83,7 +95,7 @@ public void OnItemClicked() else { // Fire a click event - breadcrumbBar.RaiseItemClickedEvent(this); + breadcrumbBar.RaiseItemClickedEvent(this, pointerRoutedEventArgs); } } diff --git a/src/Files.App.Controls/BreadcrumbBar/EventArgs.cs b/src/Files.App.Controls/BreadcrumbBar/EventArgs.cs index c28230e0a1c0..d40a11e65caf 100644 --- a/src/Files.App.Controls/BreadcrumbBar/EventArgs.cs +++ b/src/Files.App.Controls/BreadcrumbBar/EventArgs.cs @@ -1,9 +1,11 @@ // Copyright (c) Files Community // Licensed under the MIT License. +using Microsoft.UI.Xaml.Input; + namespace Files.App.Controls { - public record class BreadcrumbBarItemClickedEventArgs(BreadcrumbBarItem Item, int Index, bool IsRootItem = false); + public record class BreadcrumbBarItemClickedEventArgs(BreadcrumbBarItem Item, int Index, bool IsRootItem = false, PointerRoutedEventArgs? PointerRoutedEventArgs = null); public record class BreadcrumbBarItemDropDownFlyoutEventArgs(MenuFlyout Flyout, BreadcrumbBarItem? Item = null, int Index = -1, bool IsRootItem = false); } diff --git a/src/Files.App/UserControls/NavigationToolbar.xaml.cs b/src/Files.App/UserControls/NavigationToolbar.xaml.cs index 11bfe62fe82e..56a463cab600 100644 --- a/src/Files.App/UserControls/NavigationToolbar.xaml.cs +++ b/src/Files.App/UserControls/NavigationToolbar.xaml.cs @@ -279,7 +279,10 @@ private async void BreadcrumbBar_ItemClicked(Controls.BreadcrumbBar sender, Cont ViewModel.PathComponents[args.Index].Path is not { } path) return; - await ViewModel.HandleFolderNavigationAsync(path); + // If user clicked the item with middle mouse button, open it in new tab + var openInNewTab = args.PointerRoutedEventArgs?.GetCurrentPoint(null).Properties.PointerUpdateKind is PointerUpdateKind.MiddleButtonReleased; + + await ViewModel.HandleFolderNavigationAsync(path, openInNewTab); } private async void BreadcrumbBar_ItemDropDownFlyoutOpening(object sender, BreadcrumbBarItemDropDownFlyoutEventArgs e)