Skip to content

Commit 7eb7437

Browse files
authored
Fix: Fixed issue where icons were not displayed on submenus of shell extensions (#14070)
1 parent 237dca7 commit 7eb7437

File tree

4 files changed

+192
-0
lines changed

4 files changed

+192
-0
lines changed

src/Files.App/App.xaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
<ResourceDictionary Source="ms-appx:///ResourceDictionaries/PathIcons.xaml" />
3434
<ResourceDictionary Source="ms-appx:///UserControls/SideBar/SideBarControls.xaml" />
3535
<ResourceDictionary Source="ms-appx:///ResourceDictionaries/App.Theme.TextBlockStyles.xaml" />
36+
<ResourceDictionary Source="ms-appx:///ResourceDictionaries/MenuFlyoutSubItemWithImageStyle.xaml" />
3637
<ResourceDictionary>
3738
<ResourceDictionary.ThemeDictionaries>
3839
<ResourceDictionary x:Key="Light">

src/Files.App/Helpers/MenuFlyout/ItemModelListToContextFlyoutHelper.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) 2023 Files Community
22
// Licensed under the MIT License. See the LICENSE.
33

4+
using Files.App.UserControls.Menus;
45
using Microsoft.UI.Xaml;
56
using Microsoft.UI.Xaml.Controls;
67
using Microsoft.UI.Xaml.Media;
@@ -86,6 +87,21 @@ private static MenuFlyoutItemBase GetMenuFlyoutItem(ContextMenuFlyoutItemViewMod
8687
Text = item.Text,
8788
Tag = item.Tag,
8889
};
90+
91+
if (item.BitmapIcon is not null)
92+
{
93+
flyoutSubItem.Style = App.Current.Resources["MenuFlyoutSubItemWithImageStyle"] as Style;
94+
flyoutSubItem.CornerRadius = new(4);
95+
try
96+
{
97+
MenuFlyoutSubItemCustomProperties.SetBitmapIcon(flyoutSubItem, item.BitmapIcon);
98+
}
99+
catch (Exception e)
100+
{
101+
Debug.WriteLine(e);
102+
}
103+
}
104+
89105
item.Items.ForEach(i =>
90106
{
91107
flyoutSubItem.Items.Add(GetMenuItem(i));
@@ -109,6 +125,7 @@ private static MenuFlyoutItemBase GetItem(ContextMenuFlyoutItemViewModel i)
109125
Tag = i.Tag,
110126
Command = i.Command,
111127
CommandParameter = i.CommandParameter,
128+
CornerRadius = new(4),
112129
};
113130
try
114131
{
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
<!-- Copyright (c) 2023 Files Community. Licensed under the MIT License. See the LICENSE. -->
2+
<ResourceDictionary
3+
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
4+
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
5+
xmlns:menus="using:Files.App.UserControls.Menus">
6+
7+
<Style x:Key="MenuFlyoutSubItemWithImageStyle" TargetType="MenuFlyoutSubItem">
8+
<Setter Property="Padding" Value="{ThemeResource MenuFlyoutItemThemePadding}" />
9+
<Setter Property="FontSize" Value="{ThemeResource ControlContentThemeFontSize}" />
10+
<Setter Property="Template">
11+
<Setter.Value>
12+
<ControlTemplate TargetType="MenuFlyoutSubItem">
13+
14+
<Grid
15+
x:Name="LayoutRoot"
16+
Margin="{StaticResource MenuFlyoutItemMargin}"
17+
Padding="{TemplateBinding Padding}"
18+
Background="{TemplateBinding Background}"
19+
BorderBrush="{TemplateBinding BorderBrush}"
20+
BorderThickness="{TemplateBinding BorderThickness}"
21+
CornerRadius="{TemplateBinding CornerRadius}">
22+
<Grid>
23+
<Grid.ColumnDefinitions>
24+
<ColumnDefinition Width="*" />
25+
<ColumnDefinition Width="Auto" />
26+
</Grid.ColumnDefinitions>
27+
28+
<Viewbox
29+
x:Name="IconRoot"
30+
Grid.Column="0"
31+
Width="16"
32+
Height="16"
33+
HorizontalAlignment="Left"
34+
VerticalAlignment="Center"
35+
Visibility="Collapsed">
36+
<ContentPresenter x:Name="IconContent" Content="{TemplateBinding Icon}" />
37+
</Viewbox>
38+
39+
<Image
40+
Grid.Column="0"
41+
Width="16"
42+
Height="16"
43+
Margin="0"
44+
HorizontalAlignment="Left"
45+
VerticalAlignment="Center"
46+
Source="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=(menus:MenuFlyoutSubItemCustomProperties.BitmapIcon)}"
47+
Stretch="Uniform" />
48+
49+
<TextBlock
50+
x:Name="TextBlock"
51+
Grid.Column="0"
52+
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
53+
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
54+
Foreground="{TemplateBinding Foreground}"
55+
Text="{TemplateBinding Text}"
56+
TextTrimming="Clip" />
57+
58+
<FontIcon
59+
x:Name="SubItemChevron"
60+
Grid.Column="1"
61+
Margin="{StaticResource MenuFlyoutItemChevronMargin}"
62+
AutomationProperties.AccessibilityView="Raw"
63+
FontFamily="{ThemeResource SymbolThemeFontFamily}"
64+
FontSize="12"
65+
Foreground="{ThemeResource MenuFlyoutSubItemChevron}"
66+
Glyph="&#xE974;"
67+
MirroredWhenRightToLeft="True" />
68+
</Grid>
69+
70+
<VisualStateManager.VisualStateGroups>
71+
<VisualStateGroup x:Name="CommonStates">
72+
<VisualState x:Name="Normal" />
73+
<VisualState x:Name="PointerOver">
74+
<VisualState.Setters>
75+
<Setter Target="LayoutRoot.Background" Value="{ThemeResource MenuFlyoutSubItemBackgroundPointerOver}" />
76+
<Setter Target="TextBlock.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundPointerOver}" />
77+
<Setter Target="SubItemChevron.Foreground" Value="{ThemeResource MenuFlyoutSubItemChevronPointerOver}" />
78+
<Setter Target="IconContent.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundPointerOver}" />
79+
</VisualState.Setters>
80+
</VisualState>
81+
<VisualState x:Name="Pressed">
82+
<VisualState.Setters>
83+
<Setter Target="LayoutRoot.Background" Value="{ThemeResource MenuFlyoutSubItemBackgroundPressed}" />
84+
<Setter Target="TextBlock.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundPressed}" />
85+
<Setter Target="SubItemChevron.Foreground" Value="{ThemeResource MenuFlyoutSubItemChevronPressed}" />
86+
<Setter Target="IconContent.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundPressed}" />
87+
</VisualState.Setters>
88+
</VisualState>
89+
<VisualState x:Name="SubMenuOpened">
90+
<VisualState.Setters>
91+
<Setter Target="LayoutRoot.Background" Value="{ThemeResource MenuFlyoutSubItemBackgroundSubMenuOpened}" />
92+
<Setter Target="TextBlock.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundSubMenuOpened}" />
93+
<Setter Target="SubItemChevron.Foreground" Value="{ThemeResource MenuFlyoutSubItemChevronSubMenuOpened}" />
94+
<Setter Target="IconContent.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundSubMenuOpened}" />
95+
</VisualState.Setters>
96+
</VisualState>
97+
<VisualState x:Name="Disabled">
98+
<VisualState.Setters>
99+
<Setter Target="LayoutRoot.Background" Value="{ThemeResource MenuFlyoutSubItemBackgroundDisabled}" />
100+
<Setter Target="TextBlock.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundDisabled}" />
101+
<Setter Target="SubItemChevron.Foreground" Value="{ThemeResource MenuFlyoutSubItemChevronDisabled}" />
102+
<Setter Target="IconContent.Foreground" Value="{ThemeResource MenuFlyoutSubItemForegroundDisabled}" />
103+
</VisualState.Setters>
104+
</VisualState>
105+
</VisualStateGroup>
106+
<VisualStateGroup x:Name="CheckPlaceholderStates">
107+
<VisualState x:Name="NoPlaceholder" />
108+
<VisualState x:Name="CheckPlaceholder">
109+
<VisualState.Setters>
110+
<Setter Target="TextBlock.Margin" Value="{ThemeResource MenuFlyoutItemPlaceholderThemeThickness}" />
111+
</VisualState.Setters>
112+
</VisualState>
113+
<VisualState x:Name="IconPlaceholder">
114+
<VisualState.Setters>
115+
<Setter Target="TextBlock.Margin" Value="{ThemeResource MenuFlyoutItemPlaceholderThemeThickness}" />
116+
<Setter Target="IconRoot.Visibility" Value="Visible" />
117+
</VisualState.Setters>
118+
</VisualState>
119+
<VisualState x:Name="CheckAndIconPlaceholder">
120+
<VisualState.Setters>
121+
<Setter Target="TextBlock.Margin" Value="{ThemeResource MenuFlyoutItemDoublePlaceholderThemeThickness}" />
122+
<Setter Target="IconRoot.Margin" Value="{ThemeResource MenuFlyoutItemPlaceholderThemeThickness}" />
123+
<Setter Target="IconRoot.Visibility" Value="Visible" />
124+
</VisualState.Setters>
125+
</VisualState>
126+
</VisualStateGroup>
127+
<VisualStateGroup x:Name="PaddingSizeStates">
128+
<VisualState x:Name="DefaultPadding" />
129+
<VisualState x:Name="NarrowPadding">
130+
<Storyboard>
131+
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="LayoutRoot" Storyboard.TargetProperty="Padding">
132+
<DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource MenuFlyoutItemThemePaddingNarrow}" />
133+
</ObjectAnimationUsingKeyFrames>
134+
</Storyboard>
135+
</VisualState>
136+
</VisualStateGroup>
137+
</VisualStateManager.VisualStateGroups>
138+
</Grid>
139+
</ControlTemplate>
140+
</Setter.Value>
141+
</Setter>
142+
</Style>
143+
</ResourceDictionary>
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (c) 2023 Files Community
2+
// Licensed under the MIT License. See the LICENSE.
3+
4+
using Microsoft.UI.Xaml;
5+
using Microsoft.UI.Xaml.Controls;
6+
using Microsoft.UI.Xaml.Media.Imaging;
7+
8+
namespace Files.App.UserControls.Menus
9+
{
10+
[Microsoft.UI.Xaml.Data.Bindable]
11+
public class MenuFlyoutSubItemCustomProperties : DependencyObject
12+
{
13+
public static readonly DependencyProperty BitmapIconProperty =
14+
DependencyProperty.Register("BitmapIcon", typeof(BitmapImage), typeof(MenuFlyoutSubItemCustomProperties), new PropertyMetadata(null, OnBitmapIconChanged));
15+
16+
public static BitmapImage GetBitmapIcon(DependencyObject obj)
17+
{
18+
return (BitmapImage)obj.GetValue(BitmapIconProperty);
19+
}
20+
21+
public static void SetBitmapIcon(DependencyObject obj, BitmapImage value)
22+
{
23+
obj.SetValue(BitmapIconProperty, value);
24+
}
25+
26+
private static void OnBitmapIconChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
27+
{
28+
(d as MenuFlyoutSubItem).Icon = e.NewValue is not null ? new IconSourceElement() : null;
29+
}
30+
}
31+
}

0 commit comments

Comments
 (0)