diff --git a/samples/AtomUI.Demo.Desktop/ShowCase/PopupConfirmShowCase.axaml b/samples/AtomUI.Demo.Desktop/ShowCase/PopupConfirmShowCase.axaml
new file mode 100644
index 000000000..143ede550
--- /dev/null
+++ b/samples/AtomUI.Demo.Desktop/ShowCase/PopupConfirmShowCase.axaml
@@ -0,0 +1,21 @@
+
+
+
+
+ Delete
+
+
+
+
\ No newline at end of file
diff --git a/samples/AtomUI.Demo.Desktop/ShowCase/PopupConfirmShowCase.axaml.cs b/samples/AtomUI.Demo.Desktop/ShowCase/PopupConfirmShowCase.axaml.cs
new file mode 100644
index 000000000..ef28018f7
--- /dev/null
+++ b/samples/AtomUI.Demo.Desktop/ShowCase/PopupConfirmShowCase.axaml.cs
@@ -0,0 +1,11 @@
+using Avalonia.Controls;
+
+namespace AtomUI.Demo.Desktop.ShowCase;
+
+public partial class PopupConfirmShowCase : UserControl
+{
+ public PopupConfirmShowCase()
+ {
+ InitializeComponent();
+ }
+}
\ No newline at end of file
diff --git a/samples/AtomUI.Demo.Desktop/Views/MainView.axaml b/samples/AtomUI.Demo.Desktop/Views/MainView.axaml
index 90e585fe6..088d08c91 100644
--- a/samples/AtomUI.Demo.Desktop/Views/MainView.axaml
+++ b/samples/AtomUI.Demo.Desktop/Views/MainView.axaml
@@ -84,6 +84,9 @@
+
+
+
diff --git a/src/AtomUI.Controls/ArrowDecoratedBox/ArrowDecoratedBoxTheme.cs b/src/AtomUI.Controls/ArrowDecoratedBox/ArrowDecoratedBoxTheme.cs
index 5ef86adf9..bc53d9c87 100644
--- a/src/AtomUI.Controls/ArrowDecoratedBox/ArrowDecoratedBoxTheme.cs
+++ b/src/AtomUI.Controls/ArrowDecoratedBox/ArrowDecoratedBoxTheme.cs
@@ -5,6 +5,7 @@ using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Presenters;
using Avalonia.Controls.Templates;
+using Avalonia.Input;
using Avalonia.Styling;
namespace AtomUI.Controls;
diff --git a/src/AtomUI.Controls/Buttons/Button.cs b/src/AtomUI.Controls/Buttons/Button.cs
index 5c26e9677..ab80296aa 100644
--- a/src/AtomUI.Controls/Buttons/Button.cs
+++ b/src/AtomUI.Controls/Buttons/Button.cs
@@ -16,6 +16,7 @@ using Avalonia.Data;
using Avalonia.Layout;
using Avalonia.LogicalTree;
using Avalonia.Media;
+using Avalonia.VisualTree;
namespace AtomUI.Controls;
@@ -249,13 +250,6 @@ public class Button : AvaloniaButton,
var size = base.MeasureOverride(availableSize);
var targetWidth = size.Width;
var targetHeight = size.Height;
-
- // targetHeight += Padding.Top + Padding.Bottom;
- // if (Shape != ButtonShape.Round) {
- // targetWidth += Padding.Left + Padding.Right;
- // } else {
- // targetWidth += Math.Max(Padding.Left + Padding.Right, targetHeight);
- // }
targetHeight = Math.Max(targetHeight, ControlHeight);
@@ -399,17 +393,13 @@ public class Button : AvaloniaButton,
};
}
}
-
- TokenResourceBinder.CreateGlobalTokenBinding(this, BorderThicknessProperty, GlobalTokenResourceKey.BorderThickness,
- BindingPriority.Template,
- new RenderScaleAwareThicknessConfigure(this));
+
_customStyle.CollectStyleState();
ApplyShapeStyleConfig();
ApplyIconModeStyleConfig();
UpdatePseudoClasses();
SetupIcon();
SetupIconBrush();
- SetupEffectiveBorderThickness();
}
protected virtual void ApplyIconModeStyleConfig()
@@ -490,6 +480,15 @@ public class Button : AvaloniaButton,
}
}
+ protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
+ {
+ base.OnAttachedToVisualTree(e);
+ TokenResourceBinder.CreateGlobalTokenBinding(this, BorderThicknessProperty, GlobalTokenResourceKey.BorderThickness,
+ BindingPriority.Template,
+ new RenderScaleAwareThicknessConfigure(this));
+ SetupEffectiveBorderThickness();
+ }
+
private void SetupEffectiveBorderThickness()
{
if (ButtonType == ButtonType.Default) {
diff --git a/src/AtomUI.Controls/Flyouts/Flyout.cs b/src/AtomUI.Controls/Flyouts/Flyout.cs
index 9edc6c7a0..b8ef3c231 100644
--- a/src/AtomUI.Controls/Flyouts/Flyout.cs
+++ b/src/AtomUI.Controls/Flyouts/Flyout.cs
@@ -6,12 +6,12 @@ using AtomUI.Utils;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives.PopupPositioning;
+using Avalonia.Input;
using Avalonia.Layout;
using Avalonia.Media;
using Avalonia.Metadata;
using Avalonia.Styling;
using Avalonia.Threading;
-using Avalonia.VisualTree;
namespace AtomUI.Controls;
@@ -134,7 +134,7 @@ public class Flyout : PopupFlyoutBase
SetupArrowPosition(Popup);
}
- private void SetupArrowPosition(Popup popup, FlyoutPresenter? flyoutPresenter = null)
+ protected void SetupArrowPosition(Popup popup, FlyoutPresenter? flyoutPresenter = null)
{
if (flyoutPresenter is null) {
var child = popup.Child;
@@ -323,14 +323,14 @@ public class Flyout : PopupFlyoutBase
}
}
- if (Popup.PlacementTarget?.GetVisualRoot() is null) {
- return base.HideCore(false);
- }
- IsOpen = false;
- Dispatcher.UIThread.Post(() =>
- {
- Popup.CloseAnimation(HandlePopupClosed);
- });
+ // if (Popup.PlacementTarget?.GetVisualRoot() is null) {
+ // return base.HideCore(false);
+ // }
+ // IsOpen = false;
+ // Dispatcher.UIThread.Post(() =>
+ // {
+ // Popup.CloseAnimation(HandlePopupClosed);
+ // });
return true;
}
diff --git a/src/AtomUI.Controls/Flyouts/FlyoutHost.cs b/src/AtomUI.Controls/Flyouts/FlyoutHost.cs
index 012fa1e3d..59d1af99d 100644
--- a/src/AtomUI.Controls/Flyouts/FlyoutHost.cs
+++ b/src/AtomUI.Controls/Flyouts/FlyoutHost.cs
@@ -146,8 +146,7 @@ public class FlyoutHost : Control
}
#endregion
-
- private bool _initialized = false;
+
private DispatcherTimer? _mouseEnterDelayTimer;
private DispatcherTimer? _mouseLeaveDelayTimer;
private CompositeDisposable? _subscriptions;
@@ -157,35 +156,36 @@ public class FlyoutHost : Control
PlacementProperty.OverrideDefaultValue(PlacementMode.Top);
}
- public sealed override void ApplyTemplate()
+ public override void ApplyTemplate()
{
base.ApplyTemplate();
- if (!_initialized) {
- if (AnchorTarget is not null) {
- ((ISetLogicalParent)AnchorTarget).SetParent(this);
- VisualChildren.Add(AnchorTarget);
- }
- TokenResourceBinder.CreateGlobalTokenBinding(this, MarginToAnchorProperty, GlobalTokenResourceKey.MarginXXS);
- _initialized = true;
+ if (AnchorTarget is not null) {
+ ((ISetLogicalParent)AnchorTarget).SetParent(this);
+ VisualChildren.Add(AnchorTarget);
}
+ TokenResourceBinder.CreateGlobalTokenBinding(this, MarginToAnchorProperty, GlobalTokenResourceKey.MarginXXS);
+ SetupFlyoutProperties();
}
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnAttachedToVisualTree(e);
SetupTriggerHandler();
- SetupFlyoutProperties();
}
protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e)
{
base.OnDetachedFromVisualTree(e);
+ if (AnchorTarget is not null) {
+ ((ISetLogicalParent)AnchorTarget).SetParent(null);
+ VisualChildren.Remove(AnchorTarget);
+ }
StopMouseLeaveTimer();
StopMouseEnterTimer();
_subscriptions?.Dispose();
}
- private void SetupFlyoutProperties()
+ protected virtual void SetupFlyoutProperties()
{
if (Flyout is not null) {
BindUtils.RelayBind(this, PlacementProperty, Flyout);
diff --git a/src/AtomUI.Controls/Flyouts/FlyoutPresenter.cs b/src/AtomUI.Controls/Flyouts/FlyoutPresenter.cs
index 5d009c49a..069346dce 100644
--- a/src/AtomUI.Controls/Flyouts/FlyoutPresenter.cs
+++ b/src/AtomUI.Controls/Flyouts/FlyoutPresenter.cs
@@ -1,4 +1,5 @@
-using Avalonia.Input;
+using Avalonia.Data;
+using Avalonia.Input;
using Avalonia.LogicalTree;
namespace AtomUI.Controls;
@@ -20,4 +21,9 @@ public class FlyoutPresenter : ArrowDecoratedBox
}
base.OnKeyDown(e);
}
+
+ public FlyoutPresenter()
+ {
+ SetValue(CursorProperty, new Cursor(StandardCursorType.Arrow), BindingPriority.Template);
+ }
}
\ No newline at end of file
diff --git a/src/AtomUI.Controls/Flyouts/MenuFlyout.cs b/src/AtomUI.Controls/Flyouts/MenuFlyout.cs
index fe307e91b..be28a9a28 100644
--- a/src/AtomUI.Controls/Flyouts/MenuFlyout.cs
+++ b/src/AtomUI.Controls/Flyouts/MenuFlyout.cs
@@ -64,8 +64,6 @@ public class MenuFlyout : Flyout
set => SetValue(ItemTemplateProperty, value);
}
- private Classes? _classes;
-
protected override Control CreatePresenter()
{
var presenter = new MenuFlyoutPresenter()
@@ -106,10 +104,6 @@ public class MenuFlyout : Flyout
protected override void OnOpening(CancelEventArgs args)
{
if (Popup.Child is { } presenter) {
- if (_classes != null) {
- SetPresenterClasses(presenter, FlyoutPresenterClasses);
- }
-
if (FlyoutPresenterTheme is { } theme) {
presenter.SetValue(Control.ThemeProperty, theme);
}
diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemeRegisterGenerator/ControlThemeRegister.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemeRegisterGenerator/ControlThemeRegister.g.cs
index 1d8be452f..f53f1633d 100644
--- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemeRegisterGenerator/ControlThemeRegister.g.cs
+++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.ControlThemeRegisterGenerator/ControlThemeRegister.g.cs
@@ -44,6 +44,7 @@
ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.NumericUpDownTheme());
ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.OptionButtonGroupTheme());
ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.OptionButtonTheme());
+ ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.PopupConfirmContainerTheme());
ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.CircleProgressTheme());
ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.DashboardProgressTheme());
ThemeManager.Current.RegisterControlTheme(new AtomUI.Controls.ProgressBarTheme());
diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/ControlTokenRegister.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/ControlTokenRegister.g.cs
index 3676d82b7..57c5d5a08 100644
--- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/ControlTokenRegister.g.cs
+++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/ControlTokenRegister.g.cs
@@ -23,6 +23,7 @@
ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.MenuToken));
ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.NumericUpDownToken));
ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.OptionButtonToken));
+ ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.PopupConfirmToken));
ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.ProgressBarToken));
ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.RadioButtonToken));
ThemeManager.Current.RegisterControlTokenType(typeof(AtomUI.Controls.SegmentedToken));
diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs
index 13f7ddb2c..67ad2bdaa 100644
--- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs
+++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs
@@ -317,6 +317,16 @@ namespace AtomUI.Theme.Styling
public static readonly TokenResourceKey PaddingSM = new TokenResourceKey("OptionButton.PaddingSM", "AtomUI.Token");
}
+ public static class PopupConfirmTokenResourceKey
+ {
+ public static readonly TokenResourceKey PopupMinWidth = new TokenResourceKey("PopupConfirm.PopupMinWidth", "AtomUI.Token");
+ public static readonly TokenResourceKey PopupMinHeight = new TokenResourceKey("PopupConfirm.PopupMinHeight", "AtomUI.Token");
+ public static readonly TokenResourceKey ButtonMargin = new TokenResourceKey("PopupConfirm.ButtonMargin", "AtomUI.Token");
+ public static readonly TokenResourceKey IconMargin = new TokenResourceKey("PopupConfirm.IconMargin", "AtomUI.Token");
+ public static readonly TokenResourceKey ContentContainerMargin = new TokenResourceKey("PopupConfirm.ContentContainerMargin", "AtomUI.Token");
+ public static readonly TokenResourceKey TitleMargin = new TokenResourceKey("PopupConfirm.TitleMargin", "AtomUI.Token");
+ }
+
public static class ProgressBarTokenResourceKey
{
public static readonly TokenResourceKey DefaultColor = new TokenResourceKey("ProgressBar.DefaultColor", "AtomUI.Token");
diff --git a/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs b/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs
new file mode 100644
index 000000000..fdaa85d2a
--- /dev/null
+++ b/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs
@@ -0,0 +1,114 @@
+using Avalonia;
+using Avalonia.Controls.Templates;
+
+namespace AtomUI.Controls;
+
+public enum PopupConfirmStatus
+{
+ Info,
+ Warning,
+ Error
+}
+
+public class PopupConfirm : FlyoutHost
+{
+ #region 公共属性属性
+
+ public static readonly StyledProperty OkTextProperty =
+ AvaloniaProperty.Register(nameof(OkText), "Ok");
+
+ public static readonly StyledProperty CancelTextProperty =
+ AvaloniaProperty.Register(nameof(CancelText), "Cancel");
+
+ public static readonly StyledProperty OkButtonTypeProperty =
+ AvaloniaProperty.Register(nameof(OkButtonType), ButtonType.Primary);
+
+ public static readonly StyledProperty IsShowCancelButtonProperty =
+ AvaloniaProperty.Register(nameof(IsShowCancelButton), true);
+
+ public static readonly StyledProperty TitleProperty =
+ AvaloniaProperty.Register(nameof(Title));
+
+ public static readonly StyledProperty