ContextMenu.xaml
1 <?xml version="1.0" encoding="utf-8" ?> 2 <UserControl 3 x:Class="Microsoft.CmdPal.UI.Controls.ContextMenu" 4 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 5 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 6 xmlns:animations="using:CommunityToolkit.WinUI.Animations" 7 xmlns:cmdpalUI="using:Microsoft.CmdPal.UI" 8 xmlns:converters="using:CommunityToolkit.WinUI.Converters" 9 xmlns:coreViewModels="using:Microsoft.CmdPal.Core.ViewModels" 10 xmlns:cpcontrols="using:Microsoft.CmdPal.UI.Controls" 11 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 12 xmlns:help="using:Microsoft.CmdPal.UI.Helpers" 13 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 14 xmlns:toolkit="using:CommunityToolkit.WinUI.Controls" 15 xmlns:ui="using:CommunityToolkit.WinUI" 16 xmlns:viewModels="using:Microsoft.CmdPal.UI.ViewModels" 17 PreviewKeyDown="UserControl_PreviewKeyDown" 18 mc:Ignorable="d"> 19 20 <UserControl.Resources> 21 <ResourceDictionary> 22 <cmdpalUI:KeyChordToStringConverter x:Key="KeyChordToStringConverter" /> 23 <converters:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" /> 24 <Thickness x:Key="DefaultContextMenuItemPadding">12,8,12,8</Thickness> 25 <cmdpalUI:ContextItemTemplateSelector 26 x:Key="ContextItemTemplateSelector" 27 Critical="{StaticResource CriticalContextMenuViewModelTemplate}" 28 Default="{StaticResource DefaultContextMenuViewModelTemplate}" 29 Separator="{StaticResource SeparatorContextMenuViewModelTemplate}" /> 30 31 <!-- Template for context items in the context item menu --> 32 <DataTemplate x:Key="DefaultContextMenuViewModelTemplate" x:DataType="coreViewModels:CommandContextItemViewModel"> 33 <Grid Padding="{StaticResource DefaultContextMenuItemPadding}" AutomationProperties.Name="{x:Bind Title, Mode=OneWay}"> 34 <Grid.ColumnDefinitions> 35 <ColumnDefinition Width="32" /> 36 <ColumnDefinition Width="*" /> 37 <ColumnDefinition Width="Auto" /> 38 </Grid.ColumnDefinitions> 39 <cpcontrols:IconBox 40 Width="16" 41 Height="16" 42 Margin="4,0,0,0" 43 HorizontalAlignment="Left" 44 SourceKey="{x:Bind Icon, Mode=OneWay}" 45 SourceRequested="{x:Bind help:IconCacheProvider.SourceRequested20}" /> 46 <TextBlock 47 x:Name="TitleTextBlock" 48 Grid.Column="1" 49 MaxWidth="200" 50 HorizontalAlignment="Left" 51 VerticalAlignment="Center" 52 MaxLines="1" 53 Text="{x:Bind Title, Mode=OneWay}" 54 TextTrimming="WordEllipsis" 55 TextWrapping="NoWrap"> 56 <ToolTipService.ToolTip> 57 <ToolTip Content="{x:Bind Title, Mode=OneWay}" Visibility="{Binding IsTextTrimmed, ElementName=TitleTextBlock, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> 58 </ToolTipService.ToolTip> 59 </TextBlock> 60 <TextBlock 61 Grid.Column="2" 62 Margin="16,0,0,0" 63 HorizontalAlignment="Right" 64 VerticalAlignment="Center" 65 Foreground="{ThemeResource MenuFlyoutItemKeyboardAcceleratorTextForeground}" 66 Style="{StaticResource CaptionTextBlockStyle}" 67 Text="{x:Bind RequestedShortcut, Mode=OneWay, Converter={StaticResource KeyChordToStringConverter}}" /> 68 </Grid> 69 </DataTemplate> 70 71 <!-- Template for context items flagged as critical --> 72 <DataTemplate x:Key="CriticalContextMenuViewModelTemplate" x:DataType="coreViewModels:CommandContextItemViewModel"> 73 <Grid Padding="{StaticResource DefaultContextMenuItemPadding}" AutomationProperties.Name="{x:Bind Title, Mode=OneWay}"> 74 <Grid.ColumnDefinitions> 75 <ColumnDefinition Width="32" /> 76 <ColumnDefinition Width="*" /> 77 <ColumnDefinition Width="Auto" /> 78 </Grid.ColumnDefinitions> 79 <cpcontrols:IconBox 80 Width="16" 81 Height="16" 82 Margin="4,0,0,0" 83 HorizontalAlignment="Left" 84 Foreground="{ThemeResource SystemFillColorCriticalBrush}" 85 SourceKey="{x:Bind Icon, Mode=OneWay}" 86 SourceRequested="{x:Bind help:IconCacheProvider.SourceRequested20}" /> 87 <TextBlock 88 x:Name="TitleTextBlock" 89 Grid.Column="1" 90 MaxWidth="200" 91 HorizontalAlignment="Left" 92 VerticalAlignment="Center" 93 MaxLines="1" 94 Style="{StaticResource ContextItemTitleTextBlockCriticalStyle}" 95 Text="{x:Bind Title, Mode=OneWay}" 96 TextTrimming="WordEllipsis" 97 TextWrapping="NoWrap"> 98 <ToolTipService.ToolTip> 99 <ToolTip Content="{x:Bind Title, Mode=OneWay}" Visibility="{Binding IsTextTrimmed, ElementName=TitleTextBlock, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}" /> 100 </ToolTipService.ToolTip> 101 </TextBlock> 102 <TextBlock 103 Grid.Column="2" 104 Margin="16,0,0,0" 105 HorizontalAlignment="Right" 106 VerticalAlignment="Center" 107 Style="{StaticResource ContextItemCaptionTextBlockCriticalStyle}" 108 Text="{x:Bind RequestedShortcut, Mode=OneWay, Converter={StaticResource KeyChordToStringConverter}}" /> 109 </Grid> 110 </DataTemplate> 111 112 <!-- Template for context item separators --> 113 <DataTemplate x:Key="SeparatorContextMenuViewModelTemplate" x:DataType="coreViewModels:SeparatorViewModel"> 114 <Rectangle 115 Height="1" 116 Margin="0,2,0,2" 117 Fill="{ThemeResource MenuFlyoutSeparatorBackground}" /> 118 </DataTemplate> 119 </ResourceDictionary> 120 </UserControl.Resources> 121 122 <Grid x:Name="ContextMenuGrid"> 123 <Grid.RowDefinitions> 124 <RowDefinition /> 125 <RowDefinition /> 126 </Grid.RowDefinitions> 127 <ListView 128 x:Name="CommandsDropdown" 129 MinWidth="248" 130 Margin="0,4,0,2" 131 IsItemClickEnabled="True" 132 ItemClick="CommandsDropdown_ItemClick" 133 ItemTemplateSelector="{StaticResource ContextItemTemplateSelector}" 134 ItemsSource="{x:Bind ViewModel.FilteredItems, Mode=OneWay}" 135 PreviewKeyDown="CommandsDropdown_PreviewKeyDown" 136 SelectionMode="Single"> 137 <ListView.Resources> 138 <x:Boolean x:Key="ListViewItemSelectionIndicatorVisualEnabled">False</x:Boolean> 139 </ListView.Resources> 140 <ListView.ItemContainerStyle> 141 <Style BasedOn="{StaticResource DefaultListViewItemStyle}" TargetType="ListViewItem"> 142 <Setter Property="MinHeight" Value="0" /> 143 <Setter Property="Padding" Value="0" /> 144 </Style> 145 </ListView.ItemContainerStyle> 146 <ListView.ItemContainerTransitions> 147 <TransitionCollection /> 148 </ListView.ItemContainerTransitions> 149 </ListView> 150 <Border BorderBrush="{ThemeResource MenuFlyoutSeparatorBackground}" BorderThickness="0,0,0,1" /> 151 <TextBox 152 x:Name="ContextFilterBox" 153 x:Uid="ContextFilterBox" 154 Margin="0" 155 Padding="10,7,6,8" 156 Background="{ThemeResource AcrylicBackgroundFillColorBaseBrush}" 157 BorderThickness="0,0,0,2" 158 CornerRadius="8, 8, 0, 0" 159 IsTextScaleFactorEnabled="True" 160 KeyDown="ContextFilterBox_KeyDown" 161 PreviewKeyDown="ContextFilterBox_PreviewKeyDown" 162 Style="{StaticResource SearchTextBoxStyle}" 163 TextChanged="ContextFilterBox_TextChanged" /> 164 <VisualStateManager.VisualStateGroups> 165 <VisualStateGroup x:Name="ContextMenuOrder"> 166 <VisualState x:Name="FilterOnTop"> 167 <VisualState.StateTriggers> 168 <ui:IsEqualStateTrigger Value="{x:Bind ViewModel.FilterOnTop, Mode=OneWay}" To="True" /> 169 </VisualState.StateTriggers> 170 <VisualState.Setters> 171 <Setter Target="CommandsDropdown.(Grid.Row)" Value="1" /> 172 <Setter Target="ContextFilterBox.(Grid.Row)" Value="0" /> 173 <Setter Target="CommandsDropdown.Margin" Value="0, 3, 0, 4" /> 174 <Setter Target="ContextFilterBox.CornerRadius" Value="8, 8, 0, 0" /> 175 <Setter Target="ContextFilterBox.Margin" Value="0,0,0,-1" /> 176 </VisualState.Setters> 177 </VisualState> 178 <VisualState x:Name="FilterOnBottom"> 179 <VisualState.StateTriggers> 180 <ui:IsEqualStateTrigger Value="{x:Bind ViewModel.FilterOnTop, Mode=OneWay}" To="False" /> 181 </VisualState.StateTriggers> 182 <VisualState.Setters> 183 <Setter Target="CommandsDropdown.(Grid.Row)" Value="0" /> 184 <Setter Target="ContextFilterBox.(Grid.Row)" Value="1" /> 185 <Setter Target="CommandsDropdown.Margin" Value="0, 4, 0, 4" /> 186 <Setter Target="ContextFilterBox.CornerRadius" Value="0, 0, 8, 8" /> 187 <Setter Target="ContextFilterBox.Margin" Value="0,0,0,-2" /> 188 </VisualState.Setters> 189 </VisualState> 190 </VisualStateGroup> 191 </VisualStateManager.VisualStateGroups> 192 </Grid> 193 </UserControl>