mirror of
https://github.com/PacktPublishing/Learn-WinUI-3-Second-Edition.git
synced 2026-06-20 12:23:09 +00:00
Add chapter 10 sample project
This commit is contained in:
@@ -0,0 +1,121 @@
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
using Microsoft.UI;
|
||||
using Microsoft.UI.Xaml;
|
||||
using Microsoft.UI.Xaml.Media;
|
||||
|
||||
using Windows.UI;
|
||||
using Windows.UI.ViewManagement;
|
||||
|
||||
namespace TemplateStudioSampleApp.Helpers;
|
||||
|
||||
// Helper class to workaround custom title bar bugs.
|
||||
// DISCLAIMER: The resource key names and color values used below are subject to change. Do not depend on them.
|
||||
// https://github.com/microsoft/TemplateStudio/issues/4516
|
||||
internal class TitleBarHelper
|
||||
{
|
||||
private const int WAINACTIVE = 0x00;
|
||||
private const int WAACTIVE = 0x01;
|
||||
private const int WMACTIVATE = 0x0006;
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
private static extern IntPtr GetActiveWindow();
|
||||
|
||||
[DllImport("user32.dll", CharSet = CharSet.Auto)]
|
||||
private static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam);
|
||||
|
||||
public static void UpdateTitleBar(ElementTheme theme)
|
||||
{
|
||||
if (App.MainWindow.ExtendsContentIntoTitleBar)
|
||||
{
|
||||
if (theme == ElementTheme.Default)
|
||||
{
|
||||
var uiSettings = new UISettings();
|
||||
var background = uiSettings.GetColorValue(UIColorType.Background);
|
||||
|
||||
theme = background == Colors.White ? ElementTheme.Light : ElementTheme.Dark;
|
||||
}
|
||||
|
||||
if (theme == ElementTheme.Default)
|
||||
{
|
||||
theme = Application.Current.RequestedTheme == ApplicationTheme.Light ? ElementTheme.Light : ElementTheme.Dark;
|
||||
}
|
||||
|
||||
Application.Current.Resources["WindowCaptionForeground"] = theme switch
|
||||
{
|
||||
ElementTheme.Dark => new SolidColorBrush(Colors.White),
|
||||
ElementTheme.Light => new SolidColorBrush(Colors.Black),
|
||||
_ => new SolidColorBrush(Colors.Transparent)
|
||||
};
|
||||
|
||||
Application.Current.Resources["WindowCaptionForegroundDisabled"] = theme switch
|
||||
{
|
||||
ElementTheme.Dark => new SolidColorBrush(Color.FromArgb(0x66, 0xFF, 0xFF, 0xFF)),
|
||||
ElementTheme.Light => new SolidColorBrush(Color.FromArgb(0x66, 0x00, 0x00, 0x00)),
|
||||
_ => new SolidColorBrush(Colors.Transparent)
|
||||
};
|
||||
|
||||
Application.Current.Resources["WindowCaptionButtonBackgroundPointerOver"] = theme switch
|
||||
{
|
||||
ElementTheme.Dark => new SolidColorBrush(Color.FromArgb(0x33, 0xFF, 0xFF, 0xFF)),
|
||||
ElementTheme.Light => new SolidColorBrush(Color.FromArgb(0x33, 0x00, 0x00, 0x00)),
|
||||
_ => new SolidColorBrush(Colors.Transparent)
|
||||
};
|
||||
|
||||
Application.Current.Resources["WindowCaptionButtonBackgroundPressed"] = theme switch
|
||||
{
|
||||
ElementTheme.Dark => new SolidColorBrush(Color.FromArgb(0x66, 0xFF, 0xFF, 0xFF)),
|
||||
ElementTheme.Light => new SolidColorBrush(Color.FromArgb(0x66, 0x00, 0x00, 0x00)),
|
||||
_ => new SolidColorBrush(Colors.Transparent)
|
||||
};
|
||||
|
||||
Application.Current.Resources["WindowCaptionButtonStrokePointerOver"] = theme switch
|
||||
{
|
||||
ElementTheme.Dark => new SolidColorBrush(Colors.White),
|
||||
ElementTheme.Light => new SolidColorBrush(Colors.Black),
|
||||
_ => new SolidColorBrush(Colors.Transparent)
|
||||
};
|
||||
|
||||
Application.Current.Resources["WindowCaptionButtonStrokePressed"] = theme switch
|
||||
{
|
||||
ElementTheme.Dark => new SolidColorBrush(Colors.White),
|
||||
ElementTheme.Light => new SolidColorBrush(Colors.Black),
|
||||
_ => new SolidColorBrush(Colors.Transparent)
|
||||
};
|
||||
|
||||
Application.Current.Resources["WindowCaptionBackground"] = new SolidColorBrush(Colors.Transparent);
|
||||
Application.Current.Resources["WindowCaptionBackgroundDisabled"] = new SolidColorBrush(Colors.Transparent);
|
||||
|
||||
var hwnd = WinRT.Interop.WindowNative.GetWindowHandle(App.MainWindow);
|
||||
if (hwnd == GetActiveWindow())
|
||||
{
|
||||
SendMessage(hwnd, WMACTIVATE, WAINACTIVE, IntPtr.Zero);
|
||||
SendMessage(hwnd, WMACTIVATE, WAACTIVE, IntPtr.Zero);
|
||||
}
|
||||
else
|
||||
{
|
||||
SendMessage(hwnd, WMACTIVATE, WAACTIVE, IntPtr.Zero);
|
||||
SendMessage(hwnd, WMACTIVATE, WAINACTIVE, IntPtr.Zero);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void ApplySystemThemeToCaptionButtons()
|
||||
{
|
||||
var res = Application.Current.Resources;
|
||||
var frame = App.AppTitlebar as FrameworkElement;
|
||||
if (frame != null)
|
||||
{
|
||||
if (frame.ActualTheme == ElementTheme.Dark)
|
||||
{
|
||||
res["WindowCaptionForeground"] = Colors.White;
|
||||
}
|
||||
else
|
||||
{
|
||||
res["WindowCaptionForeground"] = Colors.Black;
|
||||
}
|
||||
|
||||
UpdateTitleBar(frame.ActualTheme);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user