Files
ShrlAlgoToolkit/WPFDark/Controls/Internals/BiaSystemButton.xaml.cs
ShrlAlgo 4d35cadb56 更新
2025-07-11 09:20:23 +08:00

153 lines
4.5 KiB
C#

using System.Windows;
using System.Windows.Controls;
namespace WPFDark.Controls.Internals
{
internal class BiaSystemButton : Button
{
#region BiaWindowAction
public BiaWindowAction WindowAction
{
get => windowAction;
set
{
if (value != windowAction)
SetValue(WindowActionProperty, value);
}
}
private BiaWindowAction windowAction;
public static readonly DependencyProperty WindowActionProperty =
DependencyProperty.Register(nameof(WindowAction), typeof(BiaWindowAction), typeof(BiaSystemButton),
new PropertyMetadata(
BiaWindowAction.None,
(s, e) =>
{
var self = (BiaSystemButton)s;
self.windowAction = (BiaWindowAction)e.NewValue;
}));
#endregion
#region IsVisibleButton
public bool IsVisibleButton
{
get => _IsVisibleButton;
set
{
if (value != _IsVisibleButton)
SetValue(IsVisibleButtonProperty, value);
}
}
private bool _IsVisibleButton = true;
public static readonly DependencyProperty IsVisibleButtonProperty =
DependencyProperty.Register(
nameof(IsVisibleButton),
typeof(bool),
typeof(BiaSystemButton),
new PropertyMetadata(
true,
(s, e) =>
{
var self = (BiaSystemButton)s;
self._IsVisibleButton = (bool)e.NewValue;
self.MakeVisibility();
}));
#endregion
static BiaSystemButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(BiaSystemButton),
new FrameworkPropertyMetadata(typeof(BiaSystemButton)));
}
private BiaWindow? parentWindow;
protected override void OnInitialized(EventArgs e)
{
base.OnInitialized(e);
parentWindow = (BiaWindow)Window.GetWindow(this);
if (parentWindow != null)
parentWindow.StateChanged += ParentWindowOnStateChanged;
MakeVisibility();
}
private void ParentWindowOnStateChanged(object? sender, EventArgs e)
{
MakeVisibility();
}
protected override void OnClick()
{
base.OnClick();
if (parentWindow is null)
return;
switch (WindowAction)
{
case BiaWindowAction.None:
break;
case BiaWindowAction.Active:
parentWindow.Activate();
break;
case BiaWindowAction.Close:
if (parentWindow.CloseButtonBehavior == BiaWindowCloseButtonBehavior.Normal)
parentWindow.Close();
parentWindow.InvokeCloseButtonClicked();
break;
case BiaWindowAction.Maximize:
parentWindow.WindowState = WindowState.Maximized;
break;
case BiaWindowAction.Minimize:
parentWindow.WindowState = WindowState.Minimized;
break;
case BiaWindowAction.Normalize:
parentWindow.WindowState = WindowState.Normal;
break;
default:
throw new ArgumentOutOfRangeException();
}
}
/// <summary>
/// 控制按钮显隐
/// </summary>
private void MakeVisibility()
{
if (IsVisibleButton == false)
{
Visibility = Visibility.Collapsed;
return;
}
if (parentWindow is null)
return;
Visibility = WindowAction switch
{
BiaWindowAction.Maximize => parentWindow.WindowState != WindowState.Maximized ? Visibility.Visible : Visibility.Collapsed,
BiaWindowAction.Minimize => parentWindow.WindowState != WindowState.Minimized ? Visibility.Visible : Visibility.Collapsed,
BiaWindowAction.Normalize => parentWindow.WindowState != WindowState.Normal ? Visibility.Visible : Visibility.Collapsed,
_ => Visibility
};
}
}
}