mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-22 00:46:48 +08:00
167 lines
5.9 KiB
C#
167 lines
5.9 KiB
C#
using AtomUI.Theme.Styling;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Controls.Primitives;
|
|
using Avalonia.Media;
|
|
using Avalonia.Styling;
|
|
|
|
namespace AtomUI.Controls;
|
|
|
|
internal abstract class BaseTextButtonTheme : BaseButtonTheme
|
|
{
|
|
|
|
public BaseTextButtonTheme(Type targetType) : base(targetType)
|
|
{
|
|
}
|
|
|
|
protected override void BuildStyles()
|
|
{
|
|
base.BuildStyles();
|
|
BuildEnabledStyle();
|
|
BuildDisabledStyle();
|
|
}
|
|
|
|
private void BuildEnabledStyle()
|
|
{
|
|
var enabledStyle = new Style(selector => selector.Nesting());
|
|
// 正常状态
|
|
enabledStyle.Add(TemplatedControl.BackgroundProperty, SharedTokenKey.ColorTransparent);
|
|
enabledStyle.Add(TemplatedControl.ForegroundProperty, ButtonTokenKey.DefaultColor);
|
|
|
|
// 正常 hover
|
|
{
|
|
var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver));
|
|
hoverStyle.Add(TemplatedControl.BackgroundProperty, ButtonTokenKey.TextHoverBg);
|
|
enabledStyle.Add(hoverStyle);
|
|
}
|
|
// 正常按下
|
|
{
|
|
var pressedStyle = new Style(selector =>
|
|
selector.Nesting().Class(StdPseudoClass.PointerOver).Class(StdPseudoClass.Pressed));
|
|
pressedStyle.Add(TemplatedControl.BackgroundProperty, SharedTokenKey.ColorBgTextActive);
|
|
enabledStyle.Add(pressedStyle);
|
|
}
|
|
|
|
// 危险按钮状态
|
|
var dangerStyle = new Style(selector => selector.Nesting().PropertyEquals(Button.IsDangerProperty, true));
|
|
dangerStyle.Add(TemplatedControl.ForegroundProperty, SharedTokenKey.ColorError);
|
|
|
|
// 危险状态 hover
|
|
{
|
|
var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver));
|
|
hoverStyle.Add(TemplatedControl.BackgroundProperty, SharedTokenKey.ColorErrorBgHover);
|
|
dangerStyle.Add(hoverStyle);
|
|
}
|
|
|
|
// 危险状态按下
|
|
{
|
|
var pressedStyle = new Style(selector =>
|
|
selector.Nesting().Class(StdPseudoClass.PointerOver).Class(StdPseudoClass.Pressed));
|
|
pressedStyle.Add(TemplatedControl.BackgroundProperty, SharedTokenKey.ColorErrorBgActive);
|
|
dangerStyle.Add(pressedStyle);
|
|
}
|
|
enabledStyle.Add(dangerStyle);
|
|
|
|
Add(enabledStyle);
|
|
}
|
|
|
|
private void BuildDisabledStyle()
|
|
{
|
|
var disabledStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.Disabled));
|
|
disabledStyle.Add(TemplatedControl.ForegroundProperty, SharedTokenKey.ColorTextDisabled);
|
|
Add(disabledStyle);
|
|
}
|
|
}
|
|
|
|
[ControlThemeProvider]
|
|
internal class TextButtonTheme : BaseTextButtonTheme
|
|
{
|
|
public const string ID = "TextButton";
|
|
|
|
public TextButtonTheme()
|
|
: base(typeof(Button))
|
|
{
|
|
}
|
|
|
|
public override string? ThemeResourceKey()
|
|
{
|
|
return ID;
|
|
}
|
|
|
|
protected override void BuildStyles()
|
|
{
|
|
base.BuildStyles();
|
|
BuildEnabledStyle();
|
|
BuildDisabledStyle();
|
|
}
|
|
|
|
private void BuildEnabledStyle()
|
|
{
|
|
var enabledStyle = new Style(selector => selector.Nesting());
|
|
// 正常状态
|
|
{
|
|
var frameStyle = new Style(selector => selector.Nesting().Template().Name(FramePart));
|
|
frameStyle.Add(Border.BackgroundProperty, Brushes.Transparent);
|
|
enabledStyle.Add(frameStyle);
|
|
}
|
|
enabledStyle.Add(TemplatedControl.ForegroundProperty, ButtonTokenKey.DefaultColor);
|
|
|
|
// 正常 hover
|
|
{
|
|
var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver));
|
|
{
|
|
var frameStyle = new Style(selector => selector.Nesting().Template().Name(FramePart));
|
|
frameStyle.Add(Border.BackgroundProperty, ButtonTokenKey.TextHoverBg);
|
|
hoverStyle.Add(frameStyle);
|
|
}
|
|
enabledStyle.Add(hoverStyle);
|
|
}
|
|
// 正常按下
|
|
{
|
|
var pressedStyle = new Style(selector =>
|
|
selector.Nesting().Class(StdPseudoClass.PointerOver).Class(StdPseudoClass.Pressed));
|
|
{
|
|
var frameStyle = new Style(selector => selector.Nesting().Template().Name(FramePart));
|
|
frameStyle.Add(Border.BackgroundProperty, SharedTokenKey.ColorBgTextActive);
|
|
pressedStyle.Add(frameStyle);
|
|
}
|
|
enabledStyle.Add(pressedStyle);
|
|
}
|
|
|
|
// 危险按钮状态
|
|
var dangerStyle = new Style(selector => selector.Nesting().PropertyEquals(Button.IsDangerProperty, true));
|
|
dangerStyle.Add(TemplatedControl.ForegroundProperty, SharedTokenKey.ColorError);
|
|
|
|
// 危险状态 hover
|
|
{
|
|
var hoverStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.PointerOver));
|
|
{
|
|
var frameStyle = new Style(selector => selector.Nesting().Template().Name(FramePart));
|
|
frameStyle.Add(Border.BackgroundProperty, SharedTokenKey.ColorErrorBgHover);
|
|
hoverStyle.Add(frameStyle);
|
|
}
|
|
dangerStyle.Add(hoverStyle);
|
|
}
|
|
|
|
// 危险状态按下
|
|
{
|
|
var pressedStyle = new Style(selector =>
|
|
selector.Nesting().Class(StdPseudoClass.PointerOver).Class(StdPseudoClass.Pressed));
|
|
{
|
|
var frameStyle = new Style(selector => selector.Nesting().Template().Name(FramePart));
|
|
frameStyle.Add(Border.BackgroundProperty, SharedTokenKey.ColorErrorBgActive);
|
|
pressedStyle.Add(frameStyle);
|
|
}
|
|
dangerStyle.Add(pressedStyle);
|
|
}
|
|
enabledStyle.Add(dangerStyle);
|
|
|
|
Add(enabledStyle);
|
|
}
|
|
|
|
private void BuildDisabledStyle()
|
|
{
|
|
var disabledStyle = new Style(selector => selector.Nesting().Class(StdPseudoClass.Disabled));
|
|
disabledStyle.Add(TemplatedControl.ForegroundProperty, SharedTokenKey.ColorTextDisabled);
|
|
Add(disabledStyle);
|
|
}
|
|
} |