calculator/src/Calculator/Views/TitleBar.xaml.cs
Rose 91adfd8e9e
Run C# import cleanup based on the Solution files (#1838)
This is to make the style consistent with the rest of the project as well as removing unused imports.
2022-06-14 15:56:37 +08:00

297 lines
14 KiB
C#

using CalculatorApp.ViewModel.Common;
using Windows.ApplicationModel.Core;
using Windows.System.Profile;
using Windows.UI.Core;
using Windows.UI.ViewManagement;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
// The User Control item template is documented at https://go.microsoft.com/fwlink/?LinkId=234236
namespace CalculatorApp
{
public sealed partial class TitleBar : UserControl
{
public TitleBar()
{
m_coreTitleBar = CoreApplication.GetCurrentView().TitleBar;
m_uiSettings = new UISettings();
m_accessibilitySettings = new AccessibilitySettings();
InitializeComponent();
m_coreTitleBar.ExtendViewIntoTitleBar = true;
Window.Current.SetTitleBar(BackgroundElement);
Loaded += OnLoaded;
Unloaded += OnUnloaded;
#if IS_STORE_BUILD
AppName.Text = AppResourceProvider.GetInstance().GetResourceString("AppName");
#else
AppName.Text = AppResourceProvider.GetInstance().GetResourceString("DevAppName");
#endif
}
public bool IsAlwaysOnTopMode
{
get => (bool)GetValue(IsAlwaysOnTopModeProperty);
set => SetValue(IsAlwaysOnTopModeProperty, value);
}
// Using a DependencyProperty as the backing store for IsAlwaysOnTopMode. This enables animation, styling, binding, etc...
public static readonly DependencyProperty IsAlwaysOnTopModeProperty =
DependencyProperty.Register(nameof(IsAlwaysOnTopMode), typeof(bool), typeof(TitleBar), new PropertyMetadata(default(bool), (sender, args) =>
{
var self = (TitleBar)sender;
self.OnIsAlwaysOnTopModePropertyChanged((bool)args.OldValue, (bool)args.NewValue);
}));
public event Windows.UI.Xaml.RoutedEventHandler AlwaysOnTopClick;
private void OnLoaded(object sender, RoutedEventArgs e)
{
// Register events
m_coreTitleBar.IsVisibleChanged += CoreTitleBarIsVisibleChanged;
m_coreTitleBar.LayoutMetricsChanged += CoreTitleBarLayoutMetricsChanged;
m_uiSettings.ColorValuesChanged += ColorValuesChanged;
m_accessibilitySettings.HighContrastChanged += OnHighContrastChanged;
Window.Current.Activated += OnWindowActivated;
// Register RequestedTheme changed callback to update title bar system button colors.
m_rootFrameRequestedThemeCallbackToken =
Utils.ThemeHelper.RegisterAppThemeChangedCallback(RootFrame_RequestedThemeChanged);
// Set properties
SetTitleBarControlColors();
SetTitleBarHeightAndPadding();
// As of Windows 10 1903: when an app runs on a PC (without Tablet mode activated)
// properties of CoreApplicationViewTitleBar aren't initialized during the first seconds after launch.
var forceDisplay = AnalyticsInfo.VersionInfo.DeviceFamily == "Windows.Desktop"
&& UIViewSettings.GetForCurrentView().UserInteractionMode == UserInteractionMode.Mouse;
SetTitleBarVisibility(forceDisplay);
}
private void OnUnloaded(object sender, RoutedEventArgs e)
{
// Unregister events
m_coreTitleBar.LayoutMetricsChanged -= CoreTitleBarLayoutMetricsChanged;
m_coreTitleBar.IsVisibleChanged -= CoreTitleBarIsVisibleChanged;
m_uiSettings.ColorValuesChanged -= ColorValuesChanged;
m_accessibilitySettings.HighContrastChanged -= OnHighContrastChanged;
Window.Current.Activated -= OnWindowActivated;
Utils.ThemeHelper.
UnregisterAppThemeChangedCallback(m_rootFrameRequestedThemeCallbackToken);
}
private void RootFrame_RequestedThemeChanged(DependencyObject sender, DependencyProperty dp)
{
if (Frame.RequestedThemeProperty == dp)
{
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() => { SetTitleBarControlColors(); }));
}
}
private void CoreTitleBarIsVisibleChanged(CoreApplicationViewTitleBar cTitleBar, object args)
{
SetTitleBarVisibility(false);
}
private void CoreTitleBarLayoutMetricsChanged(CoreApplicationViewTitleBar cTitleBar, object args)
{
SetTitleBarHeightAndPadding();
}
private void SetTitleBarVisibility(bool forceDisplay)
{
LayoutRoot.Visibility =
forceDisplay || m_coreTitleBar.IsVisible || IsAlwaysOnTopMode ? Visibility.Visible : Visibility.Collapsed;
}
private void SetTitleBarHeightAndPadding()
{
if (m_coreTitleBar.Height == 0)
{
// The titlebar isn't init
return;
}
double leftAddition = 0;
double rightAddition = 0;
if (FlowDirection == FlowDirection.LeftToRight)
{
leftAddition = m_coreTitleBar.SystemOverlayLeftInset;
rightAddition = m_coreTitleBar.SystemOverlayRightInset;
}
else
{
leftAddition = m_coreTitleBar.SystemOverlayRightInset;
rightAddition = m_coreTitleBar.SystemOverlayLeftInset;
}
LayoutRoot.Padding = new Thickness(leftAddition, 0, rightAddition, 0);
this.Height = m_coreTitleBar.Height;
}
private void ColorValuesChanged(Windows.UI.ViewManagement.UISettings sender, object e)
{
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() => { SetTitleBarControlColors(); }));
}
private void SetTitleBarControlColors()
{
var applicationView = ApplicationView.GetForCurrentView();
if (applicationView == null)
{
return;
}
var applicationTitleBar = applicationView.TitleBar;
if (applicationTitleBar == null)
{
return;
}
if (m_accessibilitySettings.HighContrast)
{
// Reset to use default colors.
applicationTitleBar.ButtonBackgroundColor = null;
applicationTitleBar.ButtonForegroundColor = null;
applicationTitleBar.ButtonInactiveBackgroundColor = null;
applicationTitleBar.ButtonInactiveForegroundColor = null;
applicationTitleBar.ButtonHoverBackgroundColor = null;
applicationTitleBar.ButtonHoverForegroundColor = null;
applicationTitleBar.ButtonPressedBackgroundColor = null;
applicationTitleBar.ButtonPressedForegroundColor = null;
}
else
{
applicationTitleBar.ButtonBackgroundColor = ButtonBackground?.Color;
applicationTitleBar.ButtonForegroundColor = ButtonForeground?.Color;
applicationTitleBar.ButtonInactiveBackgroundColor = ButtonInactiveBackground?.Color;
applicationTitleBar.ButtonInactiveForegroundColor = ButtonInactiveForeground?.Color;
applicationTitleBar.ButtonHoverBackgroundColor = ButtonHoverBackground?.Color;
applicationTitleBar.ButtonHoverForegroundColor = ButtonHoverForeground?.Color;
applicationTitleBar.ButtonPressedBackgroundColor = ButtonPressedBackground?.Color;
applicationTitleBar.ButtonPressedForegroundColor = ButtonPressedForeground?.Color;
}
}
private void OnHighContrastChanged(Windows.UI.ViewManagement.AccessibilitySettings sender, object args)
{
_ = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, new DispatchedHandler(() =>
{
SetTitleBarControlColors();
SetTitleBarVisibility(false);
}));
}
private void OnWindowActivated(object sender, WindowActivatedEventArgs e)
{
VisualStateManager.GoToState(
this, e.WindowActivationState == CoreWindowActivationState.Deactivated ? WindowNotFocused.Name : WindowFocused.Name, false);
}
private void OnIsAlwaysOnTopModePropertyChanged(bool oldValue, bool newValue)
{
SetTitleBarVisibility(false);
VisualStateManager.GoToState(this, newValue ? "AOTMiniState" : "AOTNormalState", false);
}
private void AlwaysOnTopButton_Click(object sender, RoutedEventArgs e)
{
AlwaysOnTopClick?.Invoke(this, e);
}
// Dependency properties for the color of the system title bar buttons
public Windows.UI.Xaml.Media.SolidColorBrush ButtonBackground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonBackgroundProperty);
set => SetValue(ButtonBackgroundProperty, value);
}
public static readonly DependencyProperty ButtonBackgroundProperty =
DependencyProperty.Register(nameof(ButtonBackground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonForeground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonForegroundProperty);
set => SetValue(ButtonForegroundProperty, value);
}
public static readonly DependencyProperty ButtonForegroundProperty =
DependencyProperty.Register(nameof(ButtonForeground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonInactiveBackground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonInactiveBackgroundProperty);
set => SetValue(ButtonInactiveBackgroundProperty, value);
}
public static readonly DependencyProperty ButtonInactiveBackgroundProperty =
DependencyProperty.Register(nameof(ButtonInactiveBackground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonInactiveForeground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonInactiveForegroundProperty);
set => SetValue(ButtonInactiveForegroundProperty, value);
}
public static readonly DependencyProperty ButtonInactiveForegroundProperty =
DependencyProperty.Register(nameof(ButtonInactiveForeground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonHoverBackground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonHoverBackgroundProperty);
set => SetValue(ButtonHoverBackgroundProperty, value);
}
public static readonly DependencyProperty ButtonHoverBackgroundProperty =
DependencyProperty.Register(nameof(ButtonHoverBackground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonHoverForeground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonHoverForegroundProperty);
set => SetValue(ButtonHoverForegroundProperty, value);
}
public static readonly DependencyProperty ButtonHoverForegroundProperty =
DependencyProperty.Register(nameof(ButtonHoverForeground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonPressedBackground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonPressedBackgroundProperty);
set => SetValue(ButtonPressedBackgroundProperty, value);
}
public static readonly DependencyProperty ButtonPressedBackgroundProperty =
DependencyProperty.Register(nameof(ButtonPressedBackground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public Windows.UI.Xaml.Media.SolidColorBrush ButtonPressedForeground
{
get => (Windows.UI.Xaml.Media.SolidColorBrush)GetValue(ButtonPressedForegroundProperty);
set => SetValue(ButtonPressedForegroundProperty, value);
}
public static readonly DependencyProperty ButtonPressedForegroundProperty =
DependencyProperty.Register(nameof(ButtonPressedForeground), typeof(Windows.UI.Xaml.Media.SolidColorBrush), typeof(TitleBar), new PropertyMetadata(null));
public bool BackButtonSpaceReserved
{
get => (bool)GetValue(BackButtonSpaceReservedProperty);
set => SetValue(BackButtonSpaceReservedProperty, value);
}
public static readonly DependencyProperty BackButtonSpaceReservedProperty =
DependencyProperty.Register(
nameof(BackButtonSpaceReserved), typeof(bool), typeof(TitleBar),
new PropertyMetadata(false, new PropertyChangedCallback((sender, args) =>
{
var self = sender as TitleBar;
VisualStateManager.GoToState(
self, (bool)args.NewValue ? self.BackButtonVisible.Name : self.BackButtonCollapsed.Name, true);
})));
private readonly Windows.ApplicationModel.Core.CoreApplicationViewTitleBar m_coreTitleBar;
private readonly Windows.UI.ViewManagement.UISettings m_uiSettings;
private readonly Windows.UI.ViewManagement.AccessibilitySettings m_accessibilitySettings;
private Utils.ThemeHelper.ThemeChangedCallbackToken m_rootFrameRequestedThemeCallbackToken;
}
}