Files
ShrlAlgoToolkit/WPFDark/Controls/BiaToggleButton.xaml.cs

127 lines
3.6 KiB
C#
Raw Normal View History

2025-07-11 09:20:23 +08:00
using System;
using System.Windows;
namespace WPFDark.Controls
{
public enum BiaToggleButtonBehavior
{
Normal,
RadioButton
}
public class BiaToggleButton : BiaButton
{
#region IsChecked
public bool IsChecked
{
get => _IsChecked;
set
{
if (value != _IsChecked)
SetValue(IsCheckedProperty, value);
}
}
private bool _IsChecked;
public static readonly DependencyProperty IsCheckedProperty =
DependencyProperty.Register(nameof(IsChecked), typeof(bool), typeof(BiaToggleButton),
new FrameworkPropertyMetadata(
false,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
FrameworkPropertyMetadataOptions.AffectsRender |
FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender,
(s, e) =>
{
var self = (BiaToggleButton) s;
self._IsChecked = (bool) e.NewValue;
})
{
BindsTwoWayByDefault = true
}
);
#endregion
#region Behavior
public BiaToggleButtonBehavior Behavior
{
get => _Behavior;
set
{
if (value != _Behavior)
SetValue(BehaviorProperty, value);
}
}
private BiaToggleButtonBehavior _Behavior = BiaToggleButtonBehavior.Normal;
public static readonly DependencyProperty BehaviorProperty =
DependencyProperty.Register(
nameof(Behavior),
typeof(BiaToggleButtonBehavior),
typeof(BiaToggleButton),
new FrameworkPropertyMetadata(
BiaToggleButtonBehavior.Normal,
FrameworkPropertyMetadataOptions.BindsTwoWayByDefault |
FrameworkPropertyMetadataOptions.AffectsRender |
FrameworkPropertyMetadataOptions.SubPropertiesDoNotAffectRender,
(s, e) =>
{
var self = (BiaToggleButton) s;
self._Behavior = (BiaToggleButtonBehavior) e.NewValue;
}));
#endregion
static BiaToggleButton()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(BiaToggleButton),
new FrameworkPropertyMetadata(typeof(BiaToggleButton)));
}
protected override void Clicked()
{
switch (Behavior)
{
case BiaToggleButtonBehavior.Normal:
IsChecked = !IsChecked;
base.InvokeClicked();
break;
case BiaToggleButtonBehavior.RadioButton:
if (IsChecked)
return;
IsChecked = true;
base.InvokeClicked();
if (IsChecked)
UpdateSibling();
break;
default:
throw new ArgumentOutOfRangeException();
}
}
private void UpdateSibling()
{
var parent = Parent;
if (parent is null)
return;
foreach (var child in LogicalTreeHelper.GetChildren(parent))
{
if (child is BiaToggleButton toggleButton &&
toggleButton != this)
toggleButton.IsChecked = false;
}
}
}
}