private void HandleRightClick(object sender, RoutedEventArgs e) { var rowPressed = DependencyObjectHelpers.FindParent <DataGridRow>(e.OriginalSource as DependencyObject); if (rowPressed != null) { var objectPressed = ((IList <ListedItem>)AllView.ItemsSource).ElementAtOrDefault(rowPressed.GetIndex()); if (objectPressed == null) { return; } // Check if RightTapped row is currently selected if (IsItemSelected) { if (SelectedItems.Contains(objectPressed)) { return; } } // The following code is only reachable when a user RightTapped an unselected row SetSelectedItemOnUi(objectPressed); } }
private void StackPanel_RightTapped(object sender, RightTappedRoutedEventArgs e) { var parentContainer = DependencyObjectHelpers.FindParent <GridViewItem>(e.OriginalSource as DependencyObject); if (!parentContainer.IsSelected) { ItemManipulationModel.SetSelectedItem(FileList.ItemFromContainer(parentContainer) as ListedItem); } }
private void StackPanel_RightTapped(object sender, RightTappedRoutedEventArgs e) { var parentContainer = DependencyObjectHelpers.FindParent <ListViewItem>(e.OriginalSource as DependencyObject); if (parentContainer.IsSelected) { return; } // The following code is only reachable when a user RightTapped an unselected row ItemManipulationModel.SetSelectedItem(FileList.ItemFromContainer(parentContainer) as ListedItem); }
private void RectangleSelection_LayoutUpdated(object sender, object e) { if (scrollViewer == null) { scrollViewer = DependencyObjectHelpers.FindChild <ScrollViewer>(uiElement, sv => sv.VerticalScrollMode != ScrollMode.Disabled); } if (scrollViewer != null) { uiElement.LayoutUpdated -= RectangleSelection_LayoutUpdated; } }
private void RectangleSelection_LayoutUpdated(object sender, object e) { if (scrollViewer == null) { scrollViewer = DependencyObjectHelpers.FindChild <ScrollViewer>(uiElement); } if (scrollViewer != null) { uiElement.LayoutUpdated -= RectangleSelection_LayoutUpdated; } }
private void RectangleSelection_PointerPressed(object sender, PointerRoutedEventArgs e) { itemsPosition.Clear(); dataGridRows.Clear(); DependencyObjectHelpers.FindChildren <DataGridRow>(dataGridRows, uiElement); // Find visible/loaded rows prevSelectedItems = uiElement.SelectedItems.Cast <object>().ToList(); // Save current selected items originDragPoint = new Point(e.GetCurrentPoint(uiElement).Position.X, e.GetCurrentPoint(uiElement).Position.Y); // Initial drag point relative to the topleft corner var verticalOffset = (scrollBar?.Value ?? 0) - uiElement.ColumnHeaderHeight; originDragPoint.Y += verticalOffset; // Initial drag point relative to the top of the list (considering scrolled offset) if (!e.GetCurrentPoint(uiElement).Properties.IsLeftButtonPressed || e.Pointer.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch) { // Trigger only on left click, do not trigger with touch return; } var clickedRow = DependencyObjectHelpers.FindParent <DataGridRow>(e.OriginalSource as DependencyObject); if (clickedRow != null && uiElement.SelectedItems.Contains(clickedRow.DataContext)) { // If the item under the pointer is selected do not trigger selection rectangle return; } var selectedItems = new GenericItemsCollection <object>(uiElement.SelectedItems); selectionStrategy = e.KeyModifiers.HasFlag(VirtualKeyModifiers.Control) ? new InvertPreviousItemSelectionStrategy(selectedItems, prevSelectedItems) : e.KeyModifiers.HasFlag(VirtualKeyModifiers.Shift) ? (ItemSelectionStrategy) new ExtendPreviousItemSelectionStrategy(selectedItems, prevSelectedItems) : new IgnorePreviousItemSelectionStrategy(selectedItems); if (clickedRow == null) { // If user click outside, reset selection if (uiElement.CurrentColumn != null) { uiElement.CancelEdit(); } DeselectGridCell(); selectionStrategy.HandleNoItemSelected(); } uiElement.PointerMoved -= RectangleSelection_PointerMoved; uiElement.PointerMoved += RectangleSelection_PointerMoved; if (selectionChanged != null) { // Unsunscribe from SelectionChanged event for performance uiElement.SelectionChanged -= selectionChanged; } uiElement.CapturePointer(e.Pointer); selectionState = SelectionState.Starting; }
public override void SetDragModeForItems() { if (IsItemSelected && !InstanceViewModel.IsPageTypeSearchResults) { var rows = new List <DataGridRow>(); DependencyObjectHelpers.FindChildren <DataGridRow>(rows, AllView); foreach (DataGridRow row in rows) { row.CanDrag = SelectedItems.Contains(row.DataContext); } } }
private void ItemManipulationModel_SetDragModeForItemsInvoked(object sender, EventArgs e) { if (IsItemSelected && !InstanceViewModel.IsPageTypeSearchResults) { var rows = new List <DataGridRow>(); DependencyObjectHelpers.FindChildren <DataGridRow>(rows, AllView); foreach (DataGridRow row in rows) { row.CanDrag = SelectedItems.Contains(row.DataContext); } } }
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { var selectorItems = new List <SelectorItem>(); DependencyObjectHelpers.FindChildren <SelectorItem>(selectorItems, FileList); foreach (SelectorItem gvi in selectorItems) { base.UninitializeDrag(gvi); gvi.PointerPressed -= FileListGridItem_PointerPressed; } selectorItems.Clear(); base.OnNavigatingFrom(e); FolderSettings.LayoutModeChangeRequested -= FolderSettings_LayoutModeChangeRequested; FolderSettings.GridViewSizeChangeRequested -= FolderSettings_GridViewSizeChangeRequested; }
private async void ReloadItemIcons() { var rows = new List <DataGridRow>(); DependencyObjectHelpers.FindChildren <DataGridRow>(rows, AllView); ParentShellPageInstance.FilesystemViewModel.CancelExtendedPropertiesLoading(); foreach (ListedItem listedItem in ParentShellPageInstance.FilesystemViewModel.FilesAndFolders.ToList()) { listedItem.ItemPropertiesInitialized = false; if (rows.Any(x => x.DataContext == listedItem)) { listedItem.ItemPropertiesInitialized = true; await ParentShellPageInstance.FilesystemViewModel.LoadExtendedItemProperties(listedItem); } } }
private void HandleRightClick(object sender, RoutedEventArgs e) { var rowPressed = DependencyObjectHelpers.FindParent <DataGridRow>(e.OriginalSource as DependencyObject); var objectPressed = rowPressed == null ? null : ((IList <ListedItem>)AllView.ItemsSource).ElementAtOrDefault(rowPressed.GetIndex()); if (rowPressed == null || objectPressed == null) { // Clear the selection if no item was clicked ItemManipulationModel.ClearSelection(); } else if (!IsItemSelected || !SelectedItems.Contains(objectPressed)) { // Select item if it is not already selected ItemManipulationModel.SetSelectedItem(objectPressed); } }
private async void Properties_Loaded(object sender, RoutedEventArgs e) { AppSettings.ThemeModeChanged += AppSettings_ThemeModeChanged; if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8)) { // Set window size in the loaded event to prevent flickering TitleBar = ApplicationView.GetForCurrentView().TitleBar; TitleBar.ButtonBackgroundColor = Colors.Transparent; TitleBar.ButtonInactiveBackgroundColor = Colors.Transparent; await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => AppSettings.UpdateThemeElements.Execute(null)); } else { propertiesDialog = DependencyObjectHelpers.FindParent <ContentDialog>(this); propertiesDialog.Closed += PropertiesDialog_Closed; } }
private void InitEvents(object sender, RoutedEventArgs e) { if (!uiElement.IsLoaded) { uiElement.Loaded += InitEvents; } else { uiElement.Loaded -= InitEvents; uiElement.PointerPressed += RectangleSelection_PointerPressed; uiElement.PointerReleased += RectangleSelection_PointerReleased; uiElement.PointerCaptureLost += RectangleSelection_PointerReleased; uiElement.PointerCanceled += RectangleSelection_PointerReleased; uiElement.LoadingRow += RectangleSelection_LoadingRow; uiElement.UnloadingRow += RectangleSelection_UnloadingRow; scrollBar = DependencyObjectHelpers.FindChild <ScrollBar>(uiElement); } }
private async void ViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == nameof(ViewModel.SelectedElementTheme)) { foreach (var theme in ViewModel.CustomThemes) { var container = AppThemeSelectionGridView.ContainerFromItem(theme); if (container != null) { var item = DependencyObjectHelpers.FindChild <ThemeSampleDisplayControl>(container); if (item != null) { await item.ReevaluateThemeResourceBinding(); } } } } }
protected override void Page_CharacterReceived(CoreWindow sender, CharacterReceivedEventArgs args) { if (ParentShellPageInstance != null) { if (ParentShellPageInstance.CurrentPageType == typeof(GenericFileBrowser)) { // Don't block the various uses of enter key (key 13) var focusedElement = FocusManager.GetFocusedElement() as FrameworkElement; if (args.KeyCode == 13 || focusedElement is Button || focusedElement is TextBox || focusedElement is PasswordBox || DependencyObjectHelpers.FindParent <ContentDialog>(focusedElement) != null) { return; } base.Page_CharacterReceived(sender, args); AllView.Focus(FocusState.Keyboard); } } }
private void InitEvents(object sender, RoutedEventArgs e) { if (!uiElement.IsLoaded) { uiElement.Loaded += InitEvents; } else { uiElement.Loaded -= InitEvents; uiElement.PointerPressed += RectangleSelection_PointerPressed; uiElement.PointerReleased += RectangleSelection_PointerReleased; uiElement.PointerCaptureLost += RectangleSelection_PointerReleased; uiElement.PointerCanceled += RectangleSelection_PointerReleased; scrollViewer = DependencyObjectHelpers.FindChild <ScrollViewer>(uiElement, sv => sv.VerticalScrollMode != ScrollMode.Disabled); if (scrollViewer == null) { uiElement.LayoutUpdated += RectangleSelection_LayoutUpdated; } } }
private void HandleRightClick(object sender, RoutedEventArgs e) { var rowPressed = DependencyObjectHelpers.FindParent <DataGridRow>(e.OriginalSource as DependencyObject); if (rowPressed != null) { var objectPressed = ((IList <ListedItem>)AllView.ItemsSource).ElementAtOrDefault(rowPressed.GetIndex()); if (objectPressed == null) { return; } // Check if RightTapped row is currently selected if (!IsItemSelected) { if (!SelectedItems.Contains(objectPressed)) { ItemManipulationModel.SetSelectedItem(objectPressed); } } } }
protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { var selectorItems = new List <SelectorItem>(); DependencyObjectHelpers.FindChildren <SelectorItem>(selectorItems, FileList); foreach (SelectorItem gvi in selectorItems) { base.UninitializeDrag(gvi); gvi.PointerPressed -= FileListGridItem_PointerPressed; } selectorItems.Clear(); base.OnNavigatingFrom(e); FolderSettings.LayoutModeChangeRequested -= FolderSettings_LayoutModeChangeRequested; FolderSettings.GridViewSizeChangeRequested -= FolderSettings_GridViewSizeChangeRequested; ParentShellPageInstance.FilesystemViewModel.FilesAndFolders.CollectionChanged -= FilesAndFolders_CollectionChanged; ParentShellPageInstance.FilesystemViewModel.PageTypeUpdated += FilesystemViewModel_PageTypeUpdated; if (e.SourcePageType != typeof(GridViewBrowser)) { FileList.ItemsSource = null; } }
private void RectangleSelection_PointerMoved(object sender, PointerRoutedEventArgs e) { if (scrollBar == null) { return; } var currentPoint = e.GetCurrentPoint(uiElement); var verticalOffset = scrollBar.Value - uiElement.ColumnHeaderHeight; if (selectionState == SelectionState.Starting) { if (!HasMovedMinimalDelta(originDragPoint.X, originDragPoint.Y - verticalOffset, currentPoint.Position.X, currentPoint.Position.Y)) { return; } if (uiElement.CurrentColumn != null) { uiElement.CancelEdit(); } selectionStrategy.StartSelection(); OnSelectionStarted(); selectionState = SelectionState.Active; } if (currentPoint.Properties.IsLeftButtonPressed) { var originDragPointShifted = new Point(originDragPoint.X, originDragPoint.Y - verticalOffset); // Initial drag point relative to the topleft corner base.DrawRectangle(currentPoint, originDragPointShifted, uiElement); // Selected area considering scrolled offset var rect = new System.Drawing.Rectangle((int)Canvas.GetLeft(selectionRectangle), (int)Math.Min(originDragPoint.Y, currentPoint.Position.Y + verticalOffset), (int)selectionRectangle.Width, (int)Math.Abs(originDragPoint.Y - (currentPoint.Position.Y + verticalOffset))); var dataGridRowsPosition = new Dictionary <DataGridRow, System.Drawing.Rectangle>(); double actualWidth = -1; foreach (var row in dataGridRows) { if (row.Visibility != Visibility.Visible) { continue; // Skip invalid/invisible rows } if (actualWidth < 0) { var temp = new List <DataGridCell>(); DependencyObjectHelpers.FindChildren <DataGridCell>(temp, row); // Find cells inside row actualWidth = temp.Sum(x => x.ActualWidth); // row.ActualWidth reports incorrect width } var gt = row.TransformToVisual(uiElement); var itemStartPoint = gt.TransformPoint(new Point(0, verticalOffset)); // Get item position relative to the top of the list (considering scrolled offset) var itemRect = new System.Drawing.Rectangle((int)itemStartPoint.X, (int)itemStartPoint.Y, (int)actualWidth, (int)row.ActualHeight); itemsPosition[row.DataContext] = itemRect; // Update item position dataGridRowsPosition[row] = itemRect; // Update ui row position } foreach (var item in itemsPosition.ToList()) { try { if (rect.IntersectsWith(item.Value)) { selectionStrategy.HandleIntersectionWithItem(item.Key); } else { selectionStrategy.HandleNoIntersectionWithItem(item.Key); } } catch (ArgumentException) { // Item is not present in the ItemsSource itemsPosition.Remove(item); } } if (currentPoint.Position.Y > uiElement.ActualHeight - 20) { // Scroll down the list if pointer is at the bottom // Check if there is a loaded row outside the viewport var item = dataGridRowsPosition.OrderBy(x => x.Value.Y).SkipWhile(x => x.Value.Y <= verticalOffset + uiElement.ActualHeight).Select(x => x.Key).FirstOrDefault(); if (item == null) { if (dataGridRowsPosition.Any()) { // Last loaded item is fully visible, ge thet next one from bound item source var index = dataGridRowsPosition.OrderBy(x => x.Value.Y).Last().Key.GetIndex(); var source = (System.Collections.IList)uiElement.ItemsSource; uiElement.ScrollIntoView(source[Math.Min(Math.Max(index + 1, 0), source.Count - 1)], null); } } else { uiElement.ScrollIntoView(item.DataContext, null); } } else if (currentPoint.Position.Y < 20) { // Scroll up the list if pointer is at the top // Check if there is a loaded row outside the viewport var item = dataGridRowsPosition.OrderBy(x => x.Value.Y).TakeWhile(x => x.Value.Y + x.Value.Height <= scrollBar.Value).Select(x => x.Key).LastOrDefault(); if (item == null) { if (dataGridRowsPosition.Any()) { // First loaded item is fully visible, ge thet previous one from bound item source var index = dataGridRowsPosition.OrderBy(x => x.Value.Y).First().Key.GetIndex(); var source = (System.Collections.IList)uiElement.ItemsSource; uiElement.ScrollIntoView(source[Math.Min(Math.Max(index - 1, 0), source.Count - 1)], null); } } else { uiElement.ScrollIntoView(item.DataContext, null); } } } }
private async void Properties_Loaded(object sender, RoutedEventArgs e) { AppSettings.ThemeModeChanged += AppSettings_ThemeModeChanged; if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8)) { // Set window size in the loaded event to prevent flickering if (WindowDecorationsHelper.IsWindowDecorationsAllowed) { appWindow.TitleBar.SetPreferredVisibility(AppWindowTitleBarVisibility.AlwaysHidden); appWindow.Frame.DragRegionVisuals.Add(TitleBarDragArea); crossIcon.Foreground = ThemeHelper.RootTheme switch { ElementTheme.Default => new SolidColorBrush((Color)Application.Current.Resources["SystemBaseHighColor"]), ElementTheme.Light => new SolidColorBrush(Colors.Black), ElementTheme.Dark => new SolidColorBrush(Colors.White), _ => new SolidColorBrush((Color)Application.Current.Resources["SystemBaseHighColor"]) }; var micaIsSupported = ApiInformation.IsMethodPresent("Windows.UI.Composition.Compositor", "TryCreateBlurredWallpaperBackdropBrush"); if (micaIsSupported) { micaBrush = new Brushes.MicaBrush(false); (micaBrush as Brushes.MicaBrush).SetAppWindow(appWindow); Frame.Background = micaBrush; } else { Microsoft.UI.Xaml.Controls.BackdropMaterial.SetApplyToRootOrPageBackground(sender as Control, true); } var duration = new Duration(TimeSpan.FromMilliseconds(280)); RectHoverAnim = new Storyboard(); var RectHoverColorAnim = new ColorAnimation(); RectHoverColorAnim.Duration = duration; RectHoverColorAnim.From = Colors.Transparent; RectHoverColorAnim.To = Color.FromArgb(255, 232, 17, 35); RectHoverColorAnim.EasingFunction = new SineEase(); Storyboard.SetTarget(RectHoverColorAnim, CloseRect); Storyboard.SetTargetProperty(RectHoverColorAnim, "(Rectangle.Fill).(SolidColorBrush.Color)"); RectHoverAnim.Children.Add(RectHoverColorAnim); RectUnHoverAnim = new Storyboard(); var RectUnHoverColorAnim = new ColorAnimation(); RectUnHoverColorAnim.Duration = duration; RectUnHoverColorAnim.To = Colors.Transparent; RectUnHoverColorAnim.From = Color.FromArgb(255, 232, 17, 35); RectUnHoverColorAnim.EasingFunction = new SineEase(); Storyboard.SetTarget(RectUnHoverColorAnim, CloseRect); Storyboard.SetTargetProperty(RectUnHoverColorAnim, "(Rectangle.Fill).(SolidColorBrush.Color)"); RectUnHoverAnim.Children.Add(RectUnHoverColorAnim); CrossHoverAnim = new Storyboard(); var CrossHoverColorAnim = new ColorAnimation(); CrossHoverColorAnim.Duration = duration; CrossHoverColorAnim.From = ((SolidColorBrush)crossIcon.Foreground).Color; CrossHoverColorAnim.To = Colors.White; CrossHoverColorAnim.EasingFunction = new SineEase(); Storyboard.SetTarget(CrossHoverColorAnim, crossIcon); Storyboard.SetTargetProperty(CrossHoverColorAnim, "(PathIcon.Foreground).(SolidColorBrush.Color)"); CrossHoverAnim.Children.Add(CrossHoverColorAnim); CrossUnHoverAnim = new Storyboard(); var CrossUnHoverColorAnim = new ColorAnimation(); CrossUnHoverColorAnim.Duration = duration; CrossUnHoverColorAnim.To = ((SolidColorBrush)crossIcon.Foreground).Color; CrossUnHoverColorAnim.From = Colors.White; CrossUnHoverColorAnim.EasingFunction = new SineEase(); Storyboard.SetTarget(CrossUnHoverColorAnim, crossIcon); Storyboard.SetTargetProperty(CrossUnHoverColorAnim, "(PathIcon.Foreground).(SolidColorBrush.Color)"); CrossUnHoverAnim.Children.Add(CrossUnHoverColorAnim); } else { Microsoft.UI.Xaml.Controls.BackdropMaterial.SetApplyToRootOrPageBackground(sender as Control, true); TitleBar = ApplicationView.GetForCurrentView().TitleBar; TitleBar.ButtonBackgroundColor = Colors.Transparent; TitleBar.ButtonInactiveBackgroundColor = Colors.Transparent; Window.Current.SetTitleBar(TitleBarDragArea); } await CoreApplication.MainView.DispatcherQueue.EnqueueAsync(() => AppSettings.UpdateThemeElements.Execute(null)); } else { Microsoft.UI.Xaml.Controls.BackdropMaterial.SetApplyToRootOrPageBackground(sender as Control, true); propertiesDialog = DependencyObjectHelpers.FindParent <ContentDialog>(this); propertiesDialog.Closed += PropertiesDialog_Closed; } }