private void OpenFlyout(CommandBarFlyout flyout, Button flyoutTarget)
        {
            Log.Comment("Opening flyout...");
            AutoResetEvent openedEvent = new AutoResetEvent(false);

            RunOnUIThread.Execute(() =>
            {
                flyout.Opened += (sender, args) => openedEvent.Set();

                if (ApiInformation.IsTypePresent("Windows.UI.Xaml.Controls.Primitives.FlyoutShowMode"))
                {
                    flyout.ShowAt(flyoutTarget, new FlyoutShowOptions {
                        ShowMode = FlyoutShowMode.Transient
                    });
                }
                else
                {
                    flyout.ShowAt(flyoutTarget);
                }
            });

            TestUtilities.WaitForEvent(openedEvent);
            IdleSynchronizer.Wait();
            Log.Comment("Flyout opened.");
        }
Exemplo n.º 2
0
        private void ShowFlyoutAt(FlyoutBase flyout, FrameworkElement targetElement, FlyoutShowMode showMode = FlyoutShowMode.Transient)
        {
            bool useSecondaryCommandDynamicLabel      = (bool)UseSecondaryCommandDynamicLabelCheckBox.IsChecked;
            bool useSecondaryCommandDynamicVisibility = (bool)UseSecondaryCommandDynamicVisibilityCheckBox.IsChecked;
            bool clearSecondaryCommands = (bool)ClearSecondaryCommandsCheckBox.IsChecked;
            bool addPrimaryCommandDynamicallyCheckBox = (bool)AddPrimaryCommandDynamicallyCheckBox.IsChecked;
            bool clearPrimaryCommands = (bool)ClearPrimaryCommandsCheckBox.IsChecked;

            if (useSecondaryCommandDynamicLabel || useSecondaryCommandDynamicVisibility || addPrimaryCommandDynamicallyCheckBox || clearSecondaryCommands || clearPrimaryCommands)
            {
                CommandBarFlyout commandBarFlyout = flyout as CommandBarFlyout;

                if (commandBarFlyout != null)
                {
                    if (commandBarFlyout.SecondaryCommands != null && commandBarFlyout.SecondaryCommands.Count > 0)
                    {
                        if (useSecondaryCommandDynamicLabel)
                        {
                            SetDynamicLabelSecondaryCommand(commandBarFlyout.SecondaryCommands[0] as AppBarButton);
                        }

                        if (useSecondaryCommandDynamicVisibility && commandBarFlyout.SecondaryCommands.Count > 4)
                        {
                            SetDynamicVisibilitySecondaryCommand(commandBarFlyout.SecondaryCommands[4] as AppBarButton);
                        }

                        if (clearSecondaryCommands)
                        {
                            SetClearSecondaryCommandsFlyout(commandBarFlyout);
                        }
                    }

                    if (addPrimaryCommandDynamicallyCheckBox)
                    {
                        dynamicCommandBarFlyout = commandBarFlyout;
                        SetDynamicPrimaryCommand();
                    }

                    if (clearPrimaryCommands && commandBarFlyout.PrimaryCommands != null && commandBarFlyout.PrimaryCommands.Count > 0)
                    {
                        SetClearPrimaryCommandsFlyout(commandBarFlyout);
                    }
                }
            }

            if (PlatformConfiguration.IsOsVersionGreaterThanOrEqual(OSVersion.Redstone5))
            {
                flyout.ShowAt(targetElement, new FlyoutShowOptions {
                    Placement = FlyoutPlacementMode.TopEdgeAlignedLeft, ShowMode = showMode
                });
            }
            else
            {
                flyout.Placement = FlyoutPlacementMode.Top;
                flyout.ShowAt(targetElement);
            }
        }
Exemplo n.º 3
0
 private void SetClearPrimaryCommandsFlyout(CommandBarFlyout commandBarFlyout)
 {
     if (commandBarFlyout == null)
     {
         clearPrimaryCommandsFlyout = null;
         clearPrimaryCommandsTimer.Stop();
     }
     else
     {
         clearPrimaryCommandsFlyout = commandBarFlyout;
         clearPrimaryCommandsTimer.Start();
     }
 }
        private void CloseFlyout(CommandBarFlyout flyout)
        {
            Log.Comment("Closing flyout...");
            AutoResetEvent closedEvent = new AutoResetEvent(false);

            RunOnUIThread.Execute(() =>
            {
                flyout.Closed += (sender, args) => closedEvent.Set();
                flyout.Hide();
            });

            TestUtilities.WaitForEvent(closedEvent);
            IdleSynchronizer.Wait();
            Log.Comment("Flyout closed.");
        }
        public void VerifyFlyoutDefaultPropertyValues()
        {
            if (PlatformConfiguration.IsOSVersionLessThan(OSVersion.Redstone2))
            {
                Log.Warning("Test is disabled pre-RS2 because CommandBarFlyout is not supported pre-RS2");
                return;
            }

            RunOnUIThread.Execute(() =>
            {
                CommandBarFlyout commandBarFlyout = new CommandBarFlyout();
                Verify.IsNotNull(commandBarFlyout);

                Verify.IsNotNull(commandBarFlyout.PrimaryCommands);
                Verify.AreEqual(0, commandBarFlyout.PrimaryCommands.Count);
                Verify.IsNotNull(commandBarFlyout.SecondaryCommands);
                Verify.AreEqual(0, commandBarFlyout.SecondaryCommands.Count);
            });
        }
Exemplo n.º 6
0
        public void OnFlyoutOpened(object sender, object args)
        {
            IsFlyoutOpenCheckBox.IsChecked = true;

            CommandBarFlyout commandBarFlyout = sender as CommandBarFlyout;

            if (commandBarFlyout != null && (bool)UseOverflowContentRootDynamicWidthCheckBox.IsChecked && commandBarFlyout.SecondaryCommands != null && commandBarFlyout.SecondaryCommands.Count > 0)
            {
                FrameworkElement secondaryCommandAsFE = commandBarFlyout.SecondaryCommands[0] as FrameworkElement;
                FrameworkElement overflowContentRoot  = secondaryCommandAsFE.FindVisualParentByName("OverflowContentRoot");

                if (overflowContentRoot == null)
                {
                    secondaryCommandAsFE.Loaded += SecondaryCommandAsFE_Loaded;
                }
                else
                {
                    SetDynamicOverflowContentRoot(overflowContentRoot);
                }
            }
        }
Exemplo n.º 7
0
        public void OnFlyoutOpened(object sender, object args)
        {
            IsFlyoutOpenCheckBox.IsChecked = true;

            CommandBarFlyout commandBarFlyout = sender as CommandBarFlyout;

            if (commandBarFlyout != null)
            {
                if ((bool)UseOverflowContentRootDynamicWidthCheckBox.IsChecked && commandBarFlyout.SecondaryCommands != null && commandBarFlyout.SecondaryCommands.Count > 0)
                {
                    FrameworkElement secondaryCommandAsFE = commandBarFlyout.SecondaryCommands[0] as FrameworkElement;
                    FrameworkElement overflowContentRoot  = secondaryCommandAsFE.FindVisualParentByName("OverflowContentRoot");

                    if (overflowContentRoot == null)
                    {
                        secondaryCommandAsFE.Loaded += SecondaryCommandAsFE_Loaded;
                    }
                    else
                    {
                        SetDynamicOverflowContentRoot(overflowContentRoot);
                    }
                }

                if (animatedCommandBarFlyoutCommandBarStyle != null && (bool)UseAnimatedCommandBarFlyoutCommandBarStyleCheckBox.IsChecked && commandBarFlyout.PrimaryCommands != null && commandBarFlyout.PrimaryCommands.Count > 0)
                {
                    FrameworkElement primaryCommandAsFE = commandBarFlyout.PrimaryCommands[0] as FrameworkElement;

                    if (primaryCommandAsFE != null)
                    {
                        var commandBarFlyoutCommandBar = primaryCommandAsFE.FindVisualParentByType <CommandBarFlyoutCommandBar>();

                        if (commandBarFlyoutCommandBar != null)
                        {
                            commandBarFlyoutCommandBar.Style = animatedCommandBarFlyoutCommandBarStyle;
                        }
                    }
                }
            }
        }
        public void VerifyFlyoutCommandsArePropagatedToTheCommandBar()
        {
            if (PlatformConfiguration.IsOSVersionLessThan(OSVersion.Redstone2))
            {
                Log.Warning("Test is disabled pre-RS2 because CommandBarFlyout is not supported pre-RS2");
                return;
            }

            CommandBarFlyout commandBarFlyout       = null;
            Button           commandBarFlyoutTarget = null;

            SetupCommandBarFlyoutTest(out commandBarFlyout, out commandBarFlyoutTarget);
            OpenFlyout(commandBarFlyout, commandBarFlyoutTarget);

            RunOnUIThread.Execute(() =>
            {
                Popup flyoutPopup     = VisualTreeHelper.GetOpenPopups(Window.Current).Last();
                CommandBar commandBar = TestUtilities.FindDescendents <CommandBar>(flyoutPopup).Single();

                Verify.AreEqual(commandBarFlyout.PrimaryCommands.Count, commandBar.PrimaryCommands.Count);

                for (int i = 0; i < commandBarFlyout.PrimaryCommands.Count; i++)
                {
                    Verify.AreEqual(commandBarFlyout.PrimaryCommands[i], commandBar.PrimaryCommands[i]);
                }

                Verify.AreEqual(commandBarFlyout.SecondaryCommands.Count, commandBar.SecondaryCommands.Count);

                for (int i = 0; i < commandBarFlyout.SecondaryCommands.Count; i++)
                {
                    Verify.AreEqual(commandBarFlyout.SecondaryCommands[i], commandBar.SecondaryCommands[i]);
                }
            });

            CloseFlyout(commandBarFlyout);
        }
        private void SetupCommandBarFlyoutTest(out CommandBarFlyout flyout, out Button flyoutTarget)
        {
            CommandBarFlyout commandBarFlyout       = null;
            Button           commandBarFlyoutTarget = null;

            RunOnUIThread.Execute(() =>
            {
                commandBarFlyout = new CommandBarFlyout()
                {
                    Placement = FlyoutPlacementMode.Right
                };

                commandBarFlyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Icon = new SymbolIcon(Symbol.Cut)
                });
                commandBarFlyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Icon = new SymbolIcon(Symbol.Copy)
                });
                commandBarFlyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Icon = new SymbolIcon(Symbol.Paste)
                });
                commandBarFlyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Icon = new SymbolIcon(Symbol.Bold)
                });
                commandBarFlyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Icon = new SymbolIcon(Symbol.Italic)
                });
                commandBarFlyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Icon = new SymbolIcon(Symbol.Underline)
                });

                AppBarButton undoButton = new AppBarButton()
                {
                    Label = "Undo", Icon = new SymbolIcon(Symbol.Undo)
                };
                commandBarFlyout.SecondaryCommands.Add(undoButton);
                AppBarButton redoButton = new AppBarButton()
                {
                    Label = "Redo", Icon = new SymbolIcon(Symbol.Redo)
                };
                commandBarFlyout.SecondaryCommands.Add(redoButton);
                AppBarButton selectAllButton = new AppBarButton()
                {
                    Label = "Select all"
                };
                commandBarFlyout.SecondaryCommands.Add(selectAllButton);

                if (ApiInformation.IsPropertyPresent("Windows.UI.Xaml.UIElement", "KeyboardAccelerators"))
                {
                    undoButton.KeyboardAccelerators.Add(new KeyboardAccelerator()
                    {
                        Key = VirtualKey.Z, Modifiers = VirtualKeyModifiers.Control
                    });
                    redoButton.KeyboardAccelerators.Add(new KeyboardAccelerator()
                    {
                        Key = VirtualKey.Y, Modifiers = VirtualKeyModifiers.Control
                    });
                    selectAllButton.KeyboardAccelerators.Add(new KeyboardAccelerator()
                    {
                        Key = VirtualKey.A, Modifiers = VirtualKeyModifiers.Control
                    });
                }

                commandBarFlyoutTarget = new Button()
                {
                    Content = "Click for flyout"
                };
            });

            TestUtilities.SetAsVisualTreeRoot(commandBarFlyoutTarget);
            flyout       = commandBarFlyout;
            flyoutTarget = commandBarFlyoutTarget;
        }
        public void VerifyPrimaryCommandsCanOverflowToSecondaryItemsControl()
        {
            if (PlatformConfiguration.IsOSVersionLessThan(OSVersion.Redstone2))
            {
                Log.Warning("Test is disabled pre-RS2 because CommandBarFlyout is not supported pre-RS2");
                return;
            }

            CommandBarFlyout flyout       = null;
            Button           flyoutTarget = null;

            RunOnUIThread.Execute(() =>
            {
                flyout = new CommandBarFlyout()
                {
                    Placement = FlyoutPlacementMode.Right
                };

                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 1"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 2"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 3"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 4"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 5"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 6"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 7"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 8"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 9"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 10"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 11"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 12"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 13"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 14"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 15"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 16"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 17"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 18"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 19"
                });
                flyout.PrimaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 20"
                });

                flyout.SecondaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 21"
                });
                flyout.SecondaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 22"
                });
                flyout.SecondaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 23"
                });
                flyout.SecondaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 24"
                });
                flyout.SecondaryCommands.Add(new AppBarButton()
                {
                    Label = "Item 25"
                });

                flyoutTarget = new Button()
                {
                    Content = "Click for flyout"
                };
            });

            TestUtilities.SetAsVisualTreeRoot(flyoutTarget);

            OpenFlyout(flyout, flyoutTarget);

            RunOnUIThread.Execute(() =>
            {
                Popup flyoutPopup     = VisualTreeHelper.GetOpenPopups(Window.Current).Last();
                CommandBar commandBar = TestUtilities.FindDescendents <CommandBar>(flyoutPopup).Single();

                IList <ItemsControl> itemsControls = TestUtilities.FindDescendents <ItemsControl>(commandBar);

                Log.Comment("We expect there to be 2 ItemsControls inside the CommandBar; {0} were found.", itemsControls.Count);
                Verify.AreEqual(2, itemsControls.Count);

                ItemsControl primaryItemsControl   = itemsControls[0];
                ItemsControl secondaryItemsControl = itemsControls[1];

                Log.Comment("We expect there to be 9 items located inside the primary ItemsControl; {0} were found.", primaryItemsControl.Items.Count);
                Verify.AreEqual(9, primaryItemsControl.Items.Count);
                Log.Comment("We expect there to be 17 items located inside the secondary ItemsControl (16 + autogenerated separator); {0} were found.", secondaryItemsControl.Items.Count);
                Verify.AreEqual(17, secondaryItemsControl.Items.Count);
            });

            CloseFlyout(flyout);
        }
        private void VerifyCommandBarSizing(CommandBarSizingOptions sizingOptions)
        {
            CommandBarFlyout commandBarFlyout       = null;
            Button           commandBarFlyoutTarget = null;

            SetupCommandBarFlyoutTest(out commandBarFlyout, out commandBarFlyoutTarget);

            RunOnUIThread.Execute(() =>
            {
                switch (sizingOptions)
                {
                case CommandBarSizingOptions.SecondaryItemsLarger:
                    commandBarFlyout.SecondaryCommands.Add(new AppBarButton()
                    {
                        Label = "Item with a label wider than primary items"
                    });
                    break;

                case CommandBarSizingOptions.SecondaryItemsMaxWidth:
                    commandBarFlyout.SecondaryCommands.Add(new AppBarButton()
                    {
                        Label = "Item with a really really really long label that will not fit in the space provided"
                    });
                    break;

                case CommandBarSizingOptions.SecondaryItemsMaxHeight:
                    for (int i = 0; i < 20; i++)
                    {
                        commandBarFlyout.SecondaryCommands.Add(new AppBarButton()
                        {
                            Label = "Do another thing"
                        });
                    }
                    break;
                }
            });

            OpenFlyout(commandBarFlyout, commandBarFlyoutTarget);

            CommandBar commandBar = null;

            RunOnUIThread.Execute(() =>
            {
                Popup flyoutPopup = VisualTreeHelper.GetOpenPopups(Window.Current).Last();
                commandBar        = TestUtilities.FindDescendents <CommandBar>(flyoutPopup).Single();
            });

            IdleSynchronizer.Wait();

            RunOnUIThread.Execute(() =>
            {
                // Pre-RS5, CommandBarFlyouts always open expanded, so to put us in a known good state,
                // we'll collapse the flyout before we do anything else.
                commandBar.IsOpen = false;
            });

            IdleSynchronizer.Wait();

            double originalWidth  = 0;
            double originalHeight = 0;

            RunOnUIThread.Execute(() =>
            {
                Popup flyoutPopup = VisualTreeHelper.GetOpenPopups(Window.Current).Last();
                commandBar        = TestUtilities.FindDescendents <CommandBar>(flyoutPopup).Single();

                originalWidth  = commandBar.ActualWidth;
                originalHeight = commandBar.ActualHeight;

                commandBar.IsOpen = true;
            });

            IdleSynchronizer.Wait();

            RunOnUIThread.Execute(() =>
            {
                CommandBarOverflowPresenter overflowPresenter = TestUtilities.FindDescendents <CommandBarOverflowPresenter>(commandBar).Single();

                if (sizingOptions == CommandBarSizingOptions.PrimaryItemsLarger ||
                    sizingOptions == CommandBarSizingOptions.SecondaryItemsMaxHeight)
                {
                    Verify.AreEqual(originalWidth, commandBar.ActualWidth);
                    Verify.AreEqual(originalWidth, overflowPresenter.ActualWidth);
                }
                else
                {
                    Verify.IsLessThan(originalWidth, commandBar.ActualWidth);
                    Verify.AreEqual(overflowPresenter.ActualWidth, commandBar.ActualWidth);
                }

                Verify.AreEqual(originalHeight, commandBar.ActualHeight);

                if (sizingOptions == CommandBarSizingOptions.SecondaryItemsMaxWidth)
                {
                    Verify.AreEqual(commandBar.MaxWidth, commandBar.ActualWidth);
                }
                else if (sizingOptions == CommandBarSizingOptions.SecondaryItemsMaxHeight)
                {
                    Verify.AreEqual(overflowPresenter.MaxHeight, overflowPresenter.ActualHeight);
                }

                commandBar.IsOpen = false;
            });

            IdleSynchronizer.Wait();
            CloseFlyout(commandBarFlyout);
        }
Exemplo n.º 12
0
        public static async Task SetCommandBarFlyoutWithExtraContextMenuItems(this ListViewBase ListControl, CommandBarFlyout Flyout, Point ShowAt)
        {
            if (Flyout == null)
            {
                throw new ArgumentNullException(nameof(Flyout), "Argument could not be null");
            }

            if (Interlocked.Exchange(ref ContextMenuLockResource, 1) == 0)
            {
                try
                {
                    if (ApplicationData.Current.LocalSettings.Values["ContextMenuExtSwitch"] is bool IsExt && !IsExt)
                    {
                        foreach (AppBarButton ExtraButton in Flyout.SecondaryCommands.OfType <AppBarButton>().Where((Btn) => Btn.Name == "ExtraButton").ToArray())
                        {
                            Flyout.SecondaryCommands.Remove(ExtraButton);
                        }

                        foreach (AppBarSeparator Separator in Flyout.SecondaryCommands.OfType <AppBarSeparator>().Where((Sep) => Sep.Name == "CustomSep").ToArray())
                        {
                            Flyout.SecondaryCommands.Remove(Separator);
                        }
                    }
                    else
                    {
                        string[] SelectedPathArray = null;

                        if (ListControl.SelectedItems.Count <= 1)
                        {
                            if (ListControl.SelectedItem is FileSystemStorageItemBase Selected)
                            {
                                SelectedPathArray = new string[] { Selected.Path };
                            }
                            else if (ListControl.FindParentOfType <FileControl>() is FileControl Control && !string.IsNullOrEmpty(Control.CurrentPresenter.CurrentFolder?.Path))
                            {
                                SelectedPathArray = new string[] { Control.CurrentPresenter.CurrentFolder.Path };
                            }
                        }
                        else
                        {
                            SelectedPathArray = ListControl.SelectedItems.OfType <FileSystemStorageItemBase>().Select((Item) => Item.Path).ToArray();
                        }

                        if (SelectedPathArray != null)
                        {
                            using (FullTrustProcessController.ExclusiveUsage Exclusive = await FullTrustProcessController.GetAvailableController())
                            {
                                List <ContextMenuItem> ExtraMenuItems = await Exclusive.Controller.GetContextMenuItemsAsync(SelectedPathArray, Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down)).ConfigureAwait(true);

                                foreach (AppBarButton ExtraButton in Flyout.SecondaryCommands.OfType <AppBarButton>().Where((Btn) => Btn.Name == "ExtraButton").ToArray())
                                {
                                    Flyout.SecondaryCommands.Remove(ExtraButton);
                                }

                                foreach (AppBarSeparator Separator in Flyout.SecondaryCommands.OfType <AppBarSeparator>().Where((Sep) => Sep.Name == "CustomSep").ToArray())
                                {
                                    Flyout.SecondaryCommands.Remove(Separator);
                                }

                                if (ExtraMenuItems.Count > 0)
                                {
                                    async void ClickHandler(object sender, RoutedEventArgs args)
                                    {
                                        if (sender is FrameworkElement Btn)
                                        {
                                            if (Btn.Tag is ContextMenuItem MenuItem)
                                            {
                                                Flyout.Hide();

                                                if (!await MenuItem.InvokeAsync().ConfigureAwait(true))
                                                {
                                                    QueueContentDialog Dialog = new QueueContentDialog
                                                    {
                                                        Title           = Globalization.GetString("Common_Dialog_ErrorTitle"),
                                                        Content         = Globalization.GetString("QueueDialog_InvokeContextMenuError_Content"),
                                                        CloseButtonText = Globalization.GetString("Common_Dialog_CloseButton")
                                                    };

                                                    await Dialog.ShowAsync().ConfigureAwait(true);
                                                }
                                            }
                                        }
                                    }

                                    short ShowExtNum = Convert.ToInt16(Math.Max(9 - Flyout.SecondaryCommands.Count((Item) => Item is AppBarButton), 0));

                                    int Index = Flyout.SecondaryCommands.IndexOf(Flyout.SecondaryCommands.OfType <AppBarSeparator>().FirstOrDefault()) + 1;

                                    if (ExtraMenuItems.Count > ShowExtNum + 1)
                                    {
                                        Flyout.SecondaryCommands.Insert(Index, new AppBarSeparator {
                                            Name = "CustomSep"
                                        });

                                        foreach (ContextMenuItem AddItem in ExtraMenuItems.Take(ShowExtNum))
                                        {
                                            Flyout.SecondaryCommands.Insert(Index, await AddItem.GenerateUIButtonAsync(ClickHandler).ConfigureAwait(true));
                                        }

                                        AppBarButton MoreItem = new AppBarButton
                                        {
                                            Label    = Globalization.GetString("CommandBarFlyout_More_Item"),
                                            Icon     = new SymbolIcon(Symbol.More),
                                            Name     = "ExtraButton",
                                            MinWidth = 250
                                        };

                                        MenuFlyout MoreFlyout = new MenuFlyout();

                                        await ContextMenuItem.GenerateSubMenuItemsAsync(MoreFlyout.Items, ExtraMenuItems.Skip(ShowExtNum).ToArray(), ClickHandler).ConfigureAwait(true);

                                        MoreItem.Flyout = MoreFlyout;

                                        Flyout.SecondaryCommands.Insert(Index + ShowExtNum, MoreItem);
                                    }
                                    else
                                    {
                                        foreach (ContextMenuItem AddItem in ExtraMenuItems)
                                        {
                                            Flyout.SecondaryCommands.Insert(Index, await AddItem.GenerateUIButtonAsync(ClickHandler).ConfigureAwait(true));
                                        }

                                        Flyout.SecondaryCommands.Insert(Index + ExtraMenuItems.Count, new AppBarSeparator {
                                            Name = "CustomSep"
                                        });
                                    }
                                }
                            }
                        }
                    }
                }
Exemplo n.º 13
0
        public static async Task SetCommandBarFlyoutWithExtraContextMenuItems(this ListViewBase ListControl, CommandBarFlyout Flyout, Windows.Foundation.Point?ShowAt = null)
        {
            if (Flyout == null)
            {
                throw new ArgumentNullException(nameof(Flyout), "Argument could not be null");
            }

            if (FullTrustProcessController.Current.IsNowHasAnyActionExcuting)
            {
                return;
            }

            try
            {
                ListControl.ContextFlyout = null;

                string SelectedPath;

                if (ListControl.SelectedItems.Count <= 1)
                {
                    if (ListControl.SelectedItem is FileSystemStorageItemBase Selected)
                    {
                        SelectedPath = Selected.Path;
                    }
                    else if (ListControl.FindParentOfType <FileControl>() is FileControl Control)
                    {
                        if (!string.IsNullOrEmpty(Control.CurrentFolder?.Path))
                        {
                            SelectedPath = Control.CurrentFolder.Path;
                        }
                        else
                        {
                            return;
                        }
                    }
                    else
                    {
                        return;
                    }

                    List <ContextMenuItem> ExtraMenuItems = await FullTrustProcessController.Current.GetContextMenuItemsAsync(SelectedPath, Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down)).ConfigureAwait(true);

                    if (ExtraMenuItems.Count > 0)
                    {
                        if (Flyout.SecondaryCommands.OfType <AppBarElementContainer>().FirstOrDefault() is AppBarElementContainer ExistsContainer)
                        {
                            StackPanel InnerPanel = ExistsContainer.Content as StackPanel;

                            List <ContextMenuItem> MenuExistItems = InnerPanel.Children.Select((Btn) => (Btn as Button).Tag as ContextMenuItem).ToList();

                            foreach (ContextMenuItem AddItem in ExtraMenuItems.Except(MenuExistItems))
                            {
                                Button Btn = await AddItem.GenerateUIButton().ConfigureAwait(true);

                                Btn.Click += async(s, e) =>
                                {
                                    Flyout?.Hide();

                                    if (((Button)s)?.Tag is ContextMenuItem MenuItem)
                                    {
                                        await MenuItem.Invoke().ConfigureAwait(true);
                                    }
                                };

                                InnerPanel.Children.Add(Btn);
                            }

                            foreach (ContextMenuItem RemoveItem in MenuExistItems.Except(ExtraMenuItems))
                            {
                                if (InnerPanel.Children.OfType <Button>().FirstOrDefault((Item) => (Item.Tag as ContextMenuItem) == RemoveItem) is Button Btn)
                                {
                                    InnerPanel.Children.Remove(Btn);
                                }
                            }

                            foreach (ContextMenuItem UpdateItem in MenuExistItems.Where((Item) => ExtraMenuItems.Any((Extra) => Extra.Equals(Item))))
                            {
                                UpdateItem.UpdateBelonging(SelectedPath);
                            }
                        }
                        else
                        {
                            StackPanel Panel = new StackPanel
                            {
                                HorizontalAlignment = HorizontalAlignment.Stretch
                            };

                            foreach (ContextMenuItem Item in ExtraMenuItems)
                            {
                                Button Btn = await Item.GenerateUIButton().ConfigureAwait(true);

                                Btn.Click += async(s, e) =>
                                {
                                    Flyout?.Hide();

                                    if (((Button)s)?.Tag is ContextMenuItem MenuItem)
                                    {
                                        await MenuItem.Invoke().ConfigureAwait(true);
                                    }
                                };

                                Panel.Children.Add(Btn);
                            }

                            AppBarElementContainer Container = new AppBarElementContainer
                            {
                                HorizontalContentAlignment = HorizontalAlignment.Stretch,
                                Content = Panel
                            };

                            List <int> SeparatorGroup = Flyout.SecondaryCommands.Select((Item, Index) => (Index, Item)).Where((Group) => Group.Item is AppBarSeparator).Select((Group) => Group.Index).ToList();

                            if (SeparatorGroup.Count > 0)
                            {
                                Flyout.SecondaryCommands.Insert(SeparatorGroup[0] + 1, new AppBarSeparator());
                                Flyout.SecondaryCommands.Insert(SeparatorGroup[0] + 1, Container);
                            }
                            else
                            {
                                Flyout.SecondaryCommands.Insert(0, new AppBarSeparator());
                                Flyout.SecondaryCommands.Insert(0, Container);
                            }
                        }
                    }
                    else
                    {
                        foreach (AppBarElementContainer ExistContainer in Flyout.SecondaryCommands.OfType <AppBarElementContainer>())
                        {
                            Flyout.SecondaryCommands.Remove(ExistContainer);
                        }

                        List <int> SeparatorGroup = Flyout.SecondaryCommands.Select((Item, Index) => (Index, Item)).Where((Group) => Group.Item is AppBarSeparator).Select((Group) => Group.Index).ToList();

                        if (SeparatorGroup.Count == 1)
                        {
                            if (SeparatorGroup[0] == 0)
                            {
                                Flyout.SecondaryCommands.RemoveAt(0);
                            }
                        }
                        else
                        {
                            for (int i = 0; i < SeparatorGroup.Count - 1; i++)
                            {
                                if (Math.Abs(SeparatorGroup[i] - SeparatorGroup[i + 1]) == 1)
                                {
                                    Flyout.SecondaryCommands.RemoveAt(SeparatorGroup[i]);
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                LogTracer.Log(ex);
            }
            finally
            {
                if (ShowAt != null)
                {
                    try
                    {
                        FlyoutShowOptions Option = new FlyoutShowOptions
                        {
                            Position  = ShowAt,
                            Placement = FlyoutPlacementMode.RightEdgeAlignedTop
                        };

                        Flyout?.ShowAt(ListControl, Option);
                    }
                    catch (Exception ex)
                    {
                        LogTracer.Log(ex, "An exception was threw when trying show flyout");
                    }
                }
                else
                {
                    ListControl.ContextFlyout = Flyout;
                }
            }
        }
Exemplo n.º 14
0
        public static async Task SetCommandBarFlyoutWithExtraContextMenuItems(this ListViewBase ListControl, CommandBarFlyout Flyout, Point ShowAt)
        {
            if (Flyout == null)
            {
                throw new ArgumentNullException(nameof(Flyout), "Argument could not be null");
            }

            if (Interlocked.Exchange(ref ContextMenuLockResource, 1) == 0)
            {
                try
                {
                    if (ApplicationData.Current.LocalSettings.Values["ContextMenuExtSwitch"] is bool IsExt && !IsExt)
                    {
                        foreach (AppBarElementContainer ExistContainer in Flyout.SecondaryCommands.OfType <AppBarElementContainer>())
                        {
                            Flyout.SecondaryCommands.Remove(ExistContainer);
                        }

                        List <int> SeparatorGroup = Flyout.SecondaryCommands.Select((Item, Index) => (Index, Item)).Where((Group) => Group.Item is AppBarSeparator).Select((Group) => Group.Index).ToList();

                        if (SeparatorGroup.Count == 1)
                        {
                            if (SeparatorGroup[0] == 0)
                            {
                                Flyout.SecondaryCommands.RemoveAt(0);
                            }
                        }
                        else
                        {
                            for (int i = 0; i < SeparatorGroup.Count - 1; i++)
                            {
                                if (Math.Abs(SeparatorGroup[i] - SeparatorGroup[i + 1]) == 1)
                                {
                                    Flyout.SecondaryCommands.RemoveAt(SeparatorGroup[i]);
                                }
                            }
                        }
                    }
                    else
                    {
                        string SelectedPath;

                        if (ListControl.SelectedItems.Count <= 1)
                        {
                            if (ListControl.SelectedItem is FileSystemStorageItemBase Selected)
                            {
                                SelectedPath = Selected.Path;
                            }
                            else if (ListControl.FindParentOfType <FileControl>() is FileControl Control)
                            {
                                if (!string.IsNullOrEmpty(Control.CurrentPresenter.CurrentFolder?.Path))
                                {
                                    SelectedPath = Control.CurrentPresenter.CurrentFolder.Path;
                                }
                                else
                                {
                                    return;
                                }
                            }
                            else
                            {
                                return;
                            }

                            using (FullTrustProcessController.ExclusiveUsage Exclusive = await FullTrustProcessController.GetAvailableController())
                            {
                                List <ContextMenuItem> ExtraMenuItems = await Exclusive.Controller.GetContextMenuItemsAsync(SelectedPath, Window.Current.CoreWindow.GetKeyState(VirtualKey.Shift).HasFlag(CoreVirtualKeyStates.Down)).ConfigureAwait(true);

                                foreach (AppBarButton ExtraButton in Flyout.SecondaryCommands.OfType <AppBarButton>().Where((Btn) => Btn.Name == "ExtraButton").ToArray())
                                {
                                    Flyout.SecondaryCommands.Remove(ExtraButton);
                                }

                                foreach (AppBarSeparator Separator in Flyout.SecondaryCommands.OfType <AppBarSeparator>().Where((Sep) => Sep.Name == "CustomSep").ToArray())
                                {
                                    Flyout.SecondaryCommands.Remove(Separator);
                                }

                                if (ExtraMenuItems.Count > 0)
                                {
                                    async void ClickHandler(object sender, RoutedEventArgs args)
                                    {
                                        if (sender is FrameworkElement Btn)
                                        {
                                            if (Btn.Tag is ContextMenuItem MenuItem)
                                            {
                                                Flyout.Hide();
                                                await MenuItem.InvokeAsync().ConfigureAwait(true);
                                            }
                                        }
                                    }

                                    const short ShowExtNum = 2;

                                    int Index = Flyout.SecondaryCommands.IndexOf(Flyout.SecondaryCommands.OfType <AppBarSeparator>().FirstOrDefault()) + 1;

                                    if (ExtraMenuItems.Count > ShowExtNum)
                                    {
                                        Flyout.SecondaryCommands.Insert(Index, new AppBarSeparator {
                                            Name = "CustomSep"
                                        });

                                        foreach (ContextMenuItem AddItem in ExtraMenuItems.Take(ShowExtNum))
                                        {
                                            Flyout.SecondaryCommands.Insert(Index, await AddItem.GenerateUIButtonAsync(ClickHandler).ConfigureAwait(true));
                                        }

                                        AppBarButton MoreItem = new AppBarButton
                                        {
                                            Label    = Globalization.GetString("CommandBarFlyout_More_Item"),
                                            Icon     = new SymbolIcon(Symbol.More),
                                            Name     = "ExtraButton",
                                            MinWidth = 250
                                        };

                                        MenuFlyout MoreFlyout = new MenuFlyout();

                                        await ContextMenuItem.GenerateSubMenuItemsAsync(MoreFlyout.Items, ExtraMenuItems.Skip(ShowExtNum).ToArray(), ClickHandler).ConfigureAwait(true);

                                        MoreItem.Flyout = MoreFlyout;

                                        Flyout.SecondaryCommands.Insert(Index + ShowExtNum, MoreItem);
                                    }
                                    else
                                    {
                                        foreach (ContextMenuItem AddItem in ExtraMenuItems)
                                        {
                                            Flyout.SecondaryCommands.Insert(Index, await AddItem.GenerateUIButtonAsync(ClickHandler).ConfigureAwait(true));
                                        }

                                        Flyout.SecondaryCommands.Insert(Index + ExtraMenuItems.Count, new AppBarSeparator {
                                            Name = "CustomSep"
                                        });
                                    }
                                }
                            }
                        }
                    }
                }