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."); }
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); } }
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); }); }
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); } } }
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); }
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" }); } } } } } }
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; } } }
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" }); } } } } } }