diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.cs
similarity index 100%
rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml.cs
rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.cs
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.xaml
similarity index 100%
rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabelControl.xaml
rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/IconLabel/IconLabelControl.xaml
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml
new file mode 100644
index 0000000000..3e547c6d65
--- /dev/null
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml.cs
new file mode 100644
index 0000000000..0457e715ee
--- /dev/null
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyCharPresenter.xaml.cs
@@ -0,0 +1,32 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.InteropServices.WindowsRuntime;
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Microsoft.UI.Xaml.Data;
+using Microsoft.UI.Xaml.Documents;
+using Microsoft.UI.Xaml.Input;
+using Microsoft.UI.Xaml.Media;
+
+namespace KeyboardManagerEditorUI.Controls;
+
+public sealed partial class KeyCharPresenter : Control
+{
+ public KeyCharPresenter()
+ {
+ DefaultStyleKey = typeof(KeyCharPresenter);
+ }
+
+ public object Content
+ {
+ get => (object)GetValue(ContentProperty);
+ set => SetValue(ContentProperty, value);
+ }
+
+ public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(KeyCharPresenter), new PropertyMetadata(default(string)));
+}
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml
new file mode 100644
index 0000000000..e0f04391c7
--- /dev/null
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml
@@ -0,0 +1,213 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml.cs
new file mode 100644
index 0000000000..a0ed4b0306
--- /dev/null
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/KeyVisual/KeyVisual.xaml.cs
@@ -0,0 +1,195 @@
+// Copyright (c) Microsoft Corporation
+// The Microsoft Corporation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.UI.Xaml;
+using Microsoft.UI.Xaml.Controls;
+using Windows.System;
+
+namespace KeyboardManagerEditorUI.Controls
+{
+ [TemplatePart(Name = KeyPresenter, Type = typeof(KeyCharPresenter))]
+ [TemplateVisualState(Name = NormalState, GroupName = "CommonStates")]
+ [TemplateVisualState(Name = DisabledState, GroupName = "CommonStates")]
+ [TemplateVisualState(Name = InvalidState, GroupName = "CommonStates")]
+ [TemplateVisualState(Name = WarningState, GroupName = "CommonStates")]
+ public sealed partial class KeyVisual : Control
+ {
+ private const string KeyPresenter = "KeyPresenter";
+ private const string NormalState = "Normal";
+ private const string DisabledState = "Disabled";
+ private const string InvalidState = "Invalid";
+ private const string WarningState = "Warning";
+ private KeyCharPresenter _keyPresenter;
+
+ public object Content
+ {
+ get => (object)GetValue(ContentProperty);
+ set => SetValue(ContentProperty, value);
+ }
+
+ public static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(KeyVisual), new PropertyMetadata(default(string), OnContentChanged));
+
+ public State State
+ {
+ get => (State)GetValue(StateProperty);
+ set => SetValue(StateProperty, value);
+ }
+
+ public static readonly DependencyProperty StateProperty = DependencyProperty.Register(nameof(State), typeof(State), typeof(KeyVisual), new PropertyMetadata(State.Normal, OnStateChanged));
+
+ public bool RenderKeyAsGlyph
+ {
+ get => (bool)GetValue(RenderKeyAsGlyphProperty);
+ set => SetValue(RenderKeyAsGlyphProperty, value);
+ }
+
+ public static readonly DependencyProperty RenderKeyAsGlyphProperty = DependencyProperty.Register(nameof(RenderKeyAsGlyph), typeof(bool), typeof(KeyVisual), new PropertyMetadata(false, OnContentChanged));
+
+#pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
+ public KeyVisual()
+#pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider adding the 'required' modifier or declaring as nullable.
+ {
+ this.DefaultStyleKey = typeof(KeyVisual);
+ }
+
+ protected override void OnApplyTemplate()
+ {
+ IsEnabledChanged -= KeyVisual_IsEnabledChanged;
+ _keyPresenter = (KeyCharPresenter)this.GetTemplateChild(KeyPresenter);
+ Update();
+ SetVisualStates();
+ IsEnabledChanged += KeyVisual_IsEnabledChanged;
+ base.OnApplyTemplate();
+ }
+
+ private static void OnContentChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ((KeyVisual)d).SetVisualStates();
+ }
+
+ private static void OnStateChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ ((KeyVisual)d).SetVisualStates();
+ }
+
+ private void SetVisualStates()
+ {
+ if (this != null)
+ {
+ if (State == State.Error)
+ {
+ VisualStateManager.GoToState(this, InvalidState, true);
+ }
+ else if (State == State.Warning)
+ {
+ VisualStateManager.GoToState(this, WarningState, true);
+ }
+ else if (!IsEnabled)
+ {
+ VisualStateManager.GoToState(this, DisabledState, true);
+ }
+ else
+ {
+ VisualStateManager.GoToState(this, NormalState, true);
+ }
+ }
+ }
+
+ private void Update()
+ {
+ if (Content == null)
+ {
+ return;
+ }
+
+ if (Content is string key)
+ {
+ switch (key)
+ {
+ case "Copilot":
+ _keyPresenter.Style = (Style)Application.Current.Resources["CopilotKeyCharPresenterStyle"];
+ break;
+
+ case "Office":
+ _keyPresenter.Style = (Style)Application.Current.Resources["OfficeKeyCharPresenterStyle"];
+ break;
+
+ default:
+ _keyPresenter.Style = (Style)Application.Current.Resources["DefaultKeyCharPresenterStyle"];
+ break;
+ }
+
+ return;
+ }
+
+ if (Content is int keyCode)
+ {
+ VirtualKey virtualKey = (VirtualKey)keyCode;
+ switch (virtualKey)
+ {
+ case VirtualKey.Enter:
+ SetGlyphOrText("\uE751", virtualKey);
+ break;
+
+ case VirtualKey.Back:
+ SetGlyphOrText("\uE750", virtualKey);
+ break;
+
+ case VirtualKey.Shift:
+ case (VirtualKey)160: // Left Shift
+ case (VirtualKey)161: // Right Shift
+ SetGlyphOrText("\uE752", virtualKey);
+ break;
+
+ case VirtualKey.Up:
+ _keyPresenter.Content = "\uE0E4";
+ break;
+
+ case VirtualKey.Down:
+ _keyPresenter.Content = "\uE0E5";
+ break;
+
+ case VirtualKey.Left:
+ _keyPresenter.Content = "\uE0E2";
+ break;
+
+ case VirtualKey.Right:
+ _keyPresenter.Content = "\uE0E3";
+ break;
+
+ case VirtualKey.LeftWindows:
+ case VirtualKey.RightWindows:
+ _keyPresenter.Style = (Style)Application.Current.Resources["WindowsKeyCharPresenterStyle"];
+ break;
+ }
+ }
+ }
+
+ private void SetGlyphOrText(string glyph, VirtualKey key)
+ {
+ if (RenderKeyAsGlyph)
+ {
+ _keyPresenter.Content = glyph;
+ _keyPresenter.Style = (Style)Application.Current.Resources["GlyphKeyCharPresenterStyle"];
+ }
+ else
+ {
+ _keyPresenter.Content = key.ToString();
+ _keyPresenter.Style = (Style)Application.Current.Resources["DefaultKeyCharPresenterStyle"];
+ }
+ }
+
+ private void KeyVisual_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
+ {
+ SetVisualStates();
+ }
+ }
+
+ public enum State
+ {
+ Normal,
+ Error,
+ Warning,
+ }
+}
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml
index 579d28b453..e3842618ce 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Controls/UnifiedMappingControl.xaml
@@ -1,11 +1,11 @@
-
+
-
-
-
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml
index f9524481e4..1e1537351b 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/App.xaml
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml
index a8c8c6455c..d4e02233bb 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/KeyboardManagerEditorXAML/MainWindow.xaml
@@ -35,7 +35,7 @@
-
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml
similarity index 96%
rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml
rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml
index 1b1669cd2c..984454e639 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml
@@ -1,12 +1,11 @@
+ TargetType="controls:IconLabelControl">
@@ -156,7 +155,7 @@
VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="in" />
-
+
-
@@ -244,7 +243,7 @@
VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="in" />
-
+
-
@@ -334,7 +333,7 @@
VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="in" />
-
+
-->
-
@@ -423,7 +422,7 @@
VerticalAlignment="Center"
Foreground="{ThemeResource TextFillColorSecondaryBrush}"
Text="in" />
-
+
-->
-
+
diff --git a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml.cs b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml.cs
similarity index 99%
rename from src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml.cs
rename to src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml.cs
index 6659bb1f75..53b1b3d73d 100644
--- a/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/MainPage.xaml.cs
+++ b/src/modules/keyboardmanager/KeyboardManagerEditorUI/Pages/All.xaml.cs
@@ -24,7 +24,7 @@ namespace KeyboardManagerEditorUI.Pages
/// A consolidated page that displays all mappings from Remappings, Text, Programs, and URLs pages.
///
#pragma warning disable SA1124 // Do not use regions
- public sealed partial class MainPage : Page, IDisposable
+ public sealed partial class All : Page, IDisposable
{
private KeyboardMappingService? _mappingService;
private bool _disposed;
@@ -68,7 +68,7 @@ namespace KeyboardManagerEditorUI.Pages
public bool IsAllApps { get; set; } = true;
}
- public MainPage()
+ public All()
{
this.InitializeComponent();
@@ -79,7 +79,7 @@ namespace KeyboardManagerEditorUI.Pages
}
catch (Exception ex)
{
- Logger.LogError("Failed to initialize KeyboardMappingService in MainPage page: " + ex.Message);
+ Logger.LogError("Failed to initialize KeyboardMappingService in All page: " + ex.Message);
}
this.Unloaded += All_Unloaded;