/
hlebusheck
/
notes
Обзор
Документация
Войти
/
hlebusheck
/
notes
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
Notes.Wpf/Controls/Themes/Window/WindowStyle.cs
85 строк
3 KB
Hlebusheck
Рефакторинг
21 янв 2023, 22:16
21 янв 2023, 22:16
d055c8e
Код
Авторство
О чём код?
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using System.Windows.Interop; namespace Notes.Wpf.Controls.Themes { internal static class LocalExtensions { public static void ForWindowFromTemplate(this object templateFrameworkElement, Action<Window> action) { Window window = ((FrameworkElement)templateFrameworkElement).TemplatedParent as Window; if (window != null) action(window); } public static IntPtr GetWindowHandle(this Window window) { WindowInteropHelper helper = new WindowInteropHelper(window); return helper.Handle; } } public partial class WindowStyle { void IconMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (e.ClickCount > 1) sender.ForWindowFromTemplate(w => SystemCommands.CloseWindow(w)); } void IconMouseUp(object sender, MouseButtonEventArgs e) { var element = sender as FrameworkElement; var point = element.PointToScreen(new Point(element.ActualWidth / 2, element.ActualHeight)); sender.ForWindowFromTemplate(w => SystemCommands.ShowSystemMenu(w, point)); } void WindowLoaded(object sender, RoutedEventArgs e) { ((Window)sender).StateChanged += WindowStateChanged; } void WindowStateChanged(object sender, EventArgs e) { var w = ((Window)sender); var containerBorder = (Border)w.Template.FindName("PART_Container", w); if (w.WindowState == WindowState.Maximized) { // Make sure window doesn't overlap with the taskbar. containerBorder.Padding = new Thickness( SystemParameters.WorkArea.Left + 6, SystemParameters.WorkArea.Top + 6, (SystemParameters.PrimaryScreenWidth - SystemParameters.WorkArea.Right) + 6, (SystemParameters.PrimaryScreenHeight - SystemParameters.WorkArea.Bottom) + 5); } else { containerBorder.Padding = new Thickness(7, 7, 7, 5); } } void CloseButtonClick(object sender, RoutedEventArgs e) { sender.ForWindowFromTemplate(w => SystemCommands.CloseWindow(w)); } void MinButtonClick(object sender, RoutedEventArgs e) { sender.ForWindowFromTemplate(w => SystemCommands.MinimizeWindow(w)); } void MaxButtonClick(object sender, RoutedEventArgs e) { sender.ForWindowFromTemplate(w => { if (w.WindowState == WindowState.Maximized) SystemCommands.RestoreWindow(w); else SystemCommands.MaximizeWindow(w); }); } } }