コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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);
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
        private void RectangleSelection_LayoutUpdated(object sender, object e)
        {
            if (scrollViewer == null)
            {
                scrollViewer = DependencyObjectHelpers.FindChild <ScrollViewer>(uiElement);
            }

            if (scrollViewer != null)
            {
                uiElement.LayoutUpdated -= RectangleSelection_LayoutUpdated;
            }
        }
コード例 #6
0
        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;
        }
コード例 #7
0
        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);
                }
            }
        }
コード例 #8
0
        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);
                }
            }
        }
コード例 #9
0
        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;
        }
コード例 #10
0
        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);
                }
            }
        }
コード例 #11
0
        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);
            }
        }
コード例 #12
0
 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;
     }
 }
コード例 #13
0
 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);
     }
 }
コード例 #14
0
 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();
                 }
             }
         }
     }
 }
コード例 #15
0
        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);
                }
            }
        }
コード例 #16
0
        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;
                }
            }
        }
コード例 #17
0
        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);
                    }
                }
            }
        }
コード例 #18
0
        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;
            }
        }
コード例 #19
0
        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);
                    }
                }
            }
        }
コード例 #20
0
ファイル: Properties.xaml.cs プロジェクト: GavinYou082/Files
        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;
            }
        }