From 72ebe294c0d6d66db03978ec4e9bbc29c8cfb511 Mon Sep 17 00:00:00 2001 From: CHINBOY Date: Tue, 24 Jun 2025 13:36:18 +0800 Subject: [PATCH] Add DataGridMenuFilterFlyout --- src/AtomUI.Base/MotionScene/AbstractMotion.cs | 18 +- .../AtomUIDataGridThemesProvider.axaml | 2 + .../Column/DataGridColumn.cs | 7 +- .../Column/DataGridColumnHeader.cs | 24 ++- .../Column/Filters/DataGridFilterIndicator.cs | 150 ++++++++++++++ .../Filters/DataGridMenuFilterFlyout.cs | 31 ++- .../DataGridMenuFilterFlyoutPresenter.cs | 5 + .../Filters/DataGridTreeFilterFlyout.cs | 3 +- .../DataGrid.Columns.cs | 1 - src/AtomUI.Controls.DataGrid/DataGridToken.cs | 21 +- .../TokenResourceConst.g.cs | 3 + .../Themes/DataGridColumnHeaderTheme.axaml | 11 +- .../{ => Themes}/DataGridThemeConstants.cs | 8 + .../Filters/DataGridFilterMenuItemTheme.axaml | 11 ++ ...taGridMenuFilterFlyoutPresenterTheme.axaml | 69 +++++++ .../DataGridFilterIndicatorVisibleConvert.cs | 9 +- src/AtomUI.Controls/AtomUI.Controls.csproj | 1 + .../AtomUIOSSControlThemesProvider.axaml | 2 +- src/AtomUI.Controls/Buttons/IconButton.cs | 17 ++ .../Themes/DatePickerPresenterTheme.axaml | 2 +- ...alMonthRangeDatePickerPresenterTheme.axaml | 2 +- .../TimedRangeDatePickerPresenterTheme.axaml | 2 +- src/AtomUI.Controls/Flyouts/Flyout.cs | 18 +- .../Flyouts/FlyoutStateHelper.cs | 2 +- src/AtomUI.Controls/Flyouts/MenuFlyout.cs | 4 +- .../Flyouts/MenuFlyoutPresenter.cs | 11 +- .../Flyouts/PopupFlyoutBase.cs | 17 +- .../Flyouts/Themes/FlyoutThemes.axaml | 6 + .../Flyouts/Themes/MenuFlyoutConstants.cs | 2 +- .../Themes/MenuFlyoutPresenterTheme.axaml | 53 ++--- .../Themes/MenuFlyoutPresenterTheme.cs | 7 + .../LanguageResourceConst.g.cs | 9 +- src/AtomUI.Controls/Localization/en_US.cs | 5 +- src/AtomUI.Controls/Localization/zh_CN.cs | 5 +- src/AtomUI.Controls/Menu/MenuItem.cs | 2 +- .../Menu/Themes/MenuItemTheme.axaml | 184 +++++++++--------- .../Menu/Themes/MenuItemTheme.cs | 16 ++ .../Menu/Themes/MenuThemes.axaml | 6 +- .../ToggleItemsLayoutVisibleConverter.cs | 13 +- src/AtomUI.Controls/Popup/Popup.cs | 4 +- .../PopupConfirm/Localization/en_US.cs | 4 +- .../PopupConfirm/Localization/zh_CN.cs | 4 +- .../PopupConfirm/PopupConfirm.cs | 4 +- .../Themes/TimePickerPresenterTheme.axaml | 2 +- .../Converters/StringToTextBlockConverter.cs | 2 +- 45 files changed, 577 insertions(+), 202 deletions(-) create mode 100644 src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyoutPresenter.cs rename src/AtomUI.Controls.DataGrid/{ => Themes}/DataGridThemeConstants.cs (94%) create mode 100644 src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridFilterMenuItemTheme.axaml create mode 100644 src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridMenuFilterFlyoutPresenterTheme.axaml create mode 100644 src/AtomUI.Controls/Flyouts/Themes/FlyoutThemes.axaml create mode 100644 src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.cs create mode 100644 src/AtomUI.Controls/Menu/Themes/MenuItemTheme.cs diff --git a/src/AtomUI.Base/MotionScene/AbstractMotion.cs b/src/AtomUI.Base/MotionScene/AbstractMotion.cs index fbcdcfd8b..2e42ea474 100644 --- a/src/AtomUI.Base/MotionScene/AbstractMotion.cs +++ b/src/AtomUI.Base/MotionScene/AbstractMotion.cs @@ -114,16 +114,14 @@ internal class AbstractMotion : IMotion } else { - observables.Zip() - .LastAsync() - .ObserveOn(AvaloniaScheduler.Instance) - .Subscribe(_ => - { - Dispatcher.UIThread.Post(() => - { - FinishedCallback(); - }); - }); + Dispatcher.UIThread.InvokeAsync(async () => + { + await observables.Zip() + .LastAsync() + .ObserveOn(AvaloniaScheduler.Instance) + .ToTask(); + FinishedCallback(); + }); } }); } diff --git a/src/AtomUI.Controls.DataGrid/AtomUIDataGridThemesProvider.axaml b/src/AtomUI.Controls.DataGrid/AtomUIDataGridThemesProvider.axaml index d848f2381..7ddd57b41 100644 --- a/src/AtomUI.Controls.DataGrid/AtomUIDataGridThemesProvider.axaml +++ b/src/AtomUI.Controls.DataGrid/AtomUIDataGridThemesProvider.axaml @@ -16,5 +16,7 @@ + + \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs index f357ae649..facd43566 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumn.cs @@ -249,7 +249,7 @@ public abstract partial class DataGridColumn : AvaloniaObject public bool CanUserFilter { get => CanUserResizeInternal ?? - OwningGrid?.CanUserResizeColumns ?? + OwningGrid?.CanUserFilterColumns ?? DataGrid.DefaultCanUserResizeColumns; set { @@ -424,6 +424,11 @@ public abstract partial class DataGridColumn : AvaloniaObject /// public DataGridFilterMode FilterMode { get; set; } + /// + /// Whether multiple filters can be selected + /// + public bool FilterMultiple { get; set; } = true; + /// /// Whether to trigger filter when the filter menu closes /// diff --git a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs index bf660f2b1..824d4366c 100644 --- a/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs +++ b/src/AtomUI.Controls.DataGrid/Column/DataGridColumnHeader.cs @@ -174,9 +174,21 @@ internal class DataGridColumnHeader : ContentControl get => _canUserFilter; set => SetAndRaise(CanUserFilterProperty, ref _canUserFilter, value); } - - internal DataGridColumn? OwningColumn { get; set; } - + + private DataGridColumn? _owningColumn; + internal DataGridColumn? OwningColumn + { + get => _owningColumn; + set + { + _owningColumn = value; + if (_filterIndicator != null) + { + _filterIndicator.OwningColumn = OwningColumn; + } + } + } + internal DataGrid? OwningGrid => OwningColumn?.OwningGrid; internal int ColumnIndex @@ -212,6 +224,7 @@ internal class DataGridColumnHeader : ContentControl private bool _desiredSeparatorVisibility = true; private StackPanel? _indicatorsLayout; private static Lazy _resizeCursor = new Lazy(() => new Cursor(StandardCursorType.SizeWestEast)); + private DataGridFilterIndicator? _filterIndicator; static DataGridColumnHeader() { @@ -971,6 +984,11 @@ internal class DataGridColumnHeader : ContentControl { base.OnApplyTemplate(e); _indicatorsLayout = e.NameScope.Find(DataGridColumnHeaderThemeConstants.IndicatorsLayoutPart); + _filterIndicator = e.NameScope.Find(DataGridColumnHeaderThemeConstants.FilterIndicatorPart); + if (_filterIndicator != null && OwningColumn != null) + { + _filterIndicator.OwningColumn = OwningColumn; + } if (_indicatorsLayout != null) { _indicatorsLayout.Children.CollectionChanged += HandleIndicatorLayoutChildrenChanged; diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs index 4e1f28a10..b4dddcf80 100644 --- a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridFilterIndicator.cs @@ -1,5 +1,8 @@ +using System.Diagnostics; +using AtomUI.Data; using AtomUI.IconPkg.AntDesign; using Avalonia; +using Avalonia.Controls; using Avalonia.Controls.Primitives; using Avalonia.Data; @@ -12,13 +15,83 @@ internal class DataGridFilterIndicator : IconButton public static readonly StyledProperty IsFilterActivatedProperty = AvaloniaProperty.Register(nameof(IsFilterActivated)); + public static readonly DirectProperty FilterModeProperty = + AvaloniaProperty.RegisterDirect( + nameof(FilterMode), + o => o.FilterMode, + (o, v) => o.FilterMode = v); + + public static readonly StyledProperty ToggleTypeProperty = + MenuItem.ToggleTypeProperty.AddOwner(); + public bool IsFilterActivated { get => GetValue(IsFilterActivatedProperty); set => SetValue(IsFilterActivatedProperty, value); } + private DataGridFilterMode _filterMode; + public DataGridFilterMode FilterMode + { + get => _filterMode; + set => SetAndRaise(FilterModeProperty, ref _filterMode, value); + } + + public MenuItemToggleType ToggleType + { + get => GetValue(ToggleTypeProperty); + set => SetValue(ToggleTypeProperty, value); + } + #endregion + + private DataGridColumn? _owningColumn; + private static int _indicatorSeed = 0; + private string _radioCheckGroupName; + + internal DataGridColumn? OwningColumn + { + get => _owningColumn; + set + { + _owningColumn = value; + if (_owningColumn != null) + { + FilterMode = _owningColumn.FilterMode; + ToggleType = _owningColumn.FilterMultiple ? MenuItemToggleType.CheckBox : MenuItemToggleType.Radio; + } + } + } + private readonly FlyoutStateHelper _flyoutStateHelper; + + public DataGridFilterIndicator() + { + _flyoutStateHelper = new FlyoutStateHelper + { + AnchorTarget = this, + TriggerType = FlyoutTriggerType.Click, + ClickHideFlyoutPredicate = (provider, args) => + { + if (provider.PopupHost != args.Root) + { + if (args.Root is Control control) + { + if (control.Parent is Visual visualParent) + { + var topLevel = TopLevel.GetTopLevel(visualParent); + if (provider.PopupHost == topLevel) + { + return false; + } + } + } + return true; + } + return false; + } + }; + _radioCheckGroupName = $"{nameof(DataGridFilterIndicator)}-{_indicatorSeed++}"; + } protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { @@ -26,6 +99,83 @@ internal class DataGridFilterIndicator : IconButton { SetValue(IconProperty, AntDesignIconPackage.FilterFilled(), BindingPriority.Template); } + + CreateFlyout(); base.OnApplyTemplate(e); } + + protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs changed) + { + base.OnPropertyChanged(changed); + if (changed.Property == FilterModeProperty) + { + CreateFlyout(); + } + } + + private void CreateFlyout() + { + Debug.Assert(OwningColumn is not null); + Debug.Assert(OwningColumn.OwningGrid is not null); + var owningGrid = OwningColumn.OwningGrid; + if (FilterMode == DataGridFilterMode.Menu && Flyout is not DataGridMenuFilterFlyout) + { + var menuFlyout = new DataGridMenuFilterFlyout() + { + IsShowArrow = false, + Placement = PlacementMode.BottomEdgeAlignedRight, + IsDetectMouseClickEnabled = false + }; + BindUtils.RelayBind(owningGrid, MotionAwareControlProperty.IsMotionEnabledProperty, menuFlyout, MotionAwareControlProperty.IsMotionEnabledProperty); + var menuItems = BuildMenuItems(OwningColumn.Filters.ToList()); + foreach (var menuItem in menuItems) + { + menuFlyout.Items.Add(menuItem); + } + Flyout = menuFlyout; + _flyoutStateHelper.Flyout = menuFlyout; + } + else if (FilterMode == DataGridFilterMode.Tree && Flyout is not DataGridTreeFilterFlyout) + { + Flyout = new DataGridTreeFilterFlyout(); + } + } + + private List BuildMenuItems(List filterItems) + { + var menuItems = new List(); + foreach (var item in filterItems) + { + var menuItem = new DataGridFilterMenuItem() + { + Header = item.Text, + FilterValue = item.Value, + StaysOpenOnClick = true, + GroupName = _radioCheckGroupName + }; + BindUtils.RelayBind(this, ToggleTypeProperty, menuItem, ToggleTypeProperty); + menuItems.Add(menuItem); + if (item.Children.Count > 0) + { + var childItems = BuildMenuItems(item.Children); + foreach (var childItem in childItems) + { + menuItem.Items.Add(childItem); + } + } + } + return menuItems; + } + + protected override void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnDetachedFromVisualTree(e); + _flyoutStateHelper.NotifyDetachedFromVisualTree(); + } + + protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) + { + base.OnAttachedToVisualTree(e); + _flyoutStateHelper.NotifyAttachedToVisualTree(); + } } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs index 84de93109..f033090ce 100644 --- a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyout.cs @@ -1,6 +1,33 @@ +using AtomUI.Data; +using Avalonia.Controls; + namespace AtomUI.Controls; -public class DataGridMenuFilterFlyout +internal class DataGridMenuFilterFlyout : MenuFlyout { - + protected override Control CreatePresenter() + { + var presenter = new DataGridMenuFilterFlyoutPresenter + { + ItemsSource = Items, + [!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty], + [!ItemsControl.ItemContainerThemeProperty] = this[!ItemContainerThemeProperty], + MenuFlyout = this + }; + BindUtils.RelayBind(this, IsShowArrowEffectiveProperty, presenter, MenuFlyoutPresenter.IsShowArrowProperty); + BindUtils.RelayBind(this, IsMotionEnabledProperty, presenter, MenuFlyoutPresenter.IsMotionEnabledProperty); + SetupArrowPosition(Popup, presenter); + CalculateShowArrowEffective(); + return presenter; + } +} + +internal class DataGridFilterMenuItem : MenuItem +{ + public string? FilterValue { get; set; } + + static DataGridFilterMenuItem() + { + StaysOpenOnClickProperty.OverrideDefaultValue(true); + } } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyoutPresenter.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyoutPresenter.cs new file mode 100644 index 000000000..4efdae278 --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridMenuFilterFlyoutPresenter.cs @@ -0,0 +1,5 @@ +namespace AtomUI.Controls; + +internal class DataGridMenuFilterFlyoutPresenter : MenuFlyoutPresenter +{ +} \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs index 24a65bd44..05e28b291 100644 --- a/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs +++ b/src/AtomUI.Controls.DataGrid/Column/Filters/DataGridTreeFilterFlyout.cs @@ -1,6 +1,5 @@ namespace AtomUI.Controls; -public class DataGridTreeFilterFlyout +public class DataGridTreeFilterFlyout : Flyout { - } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs index 665978db9..5133655ad 100644 --- a/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs +++ b/src/AtomUI.Controls.DataGrid/DataGrid.Columns.cs @@ -8,7 +8,6 @@ using System.Collections.Specialized; using System.ComponentModel.DataAnnotations; using System.Diagnostics; using System.Reflection; -using AtomUI.Data; using AtomUI.Utils; using Avalonia.Controls; using Avalonia.Data; diff --git a/src/AtomUI.Controls.DataGrid/DataGridToken.cs b/src/AtomUI.Controls.DataGrid/DataGridToken.cs index c096eedd5..a6797b739 100644 --- a/src/AtomUI.Controls.DataGrid/DataGridToken.cs +++ b/src/AtomUI.Controls.DataGrid/DataGridToken.cs @@ -217,7 +217,14 @@ internal class DataGridToken : AbstractControlDesignToken public Color TableFixedHeaderSortActiveBg { get; set; } public Color TableHeaderFilterActiveBg { get; set; } public Color TableFilterDropdownBg { get; set; } + public double TableFilterButtonSpacing { get; set; } + public Thickness TableFilterButtonContainerMargin { get; set; } + public Thickness TableFilterButtonLayoutSeparatorMargin { get; set; } + public double TableFilterDropdownHeight { get; set; } + public double TableFilterDropdownWidth { get; set; } + public double TableFilterDropdownSearchWidth { get; set; } + public Color TableRowHoverBg { get; set; } public Color TableSelectedRowBg { get; set; } public Color TableSelectedRowHoverBg { get; set; } @@ -227,8 +234,7 @@ internal class DataGridToken : AbstractControlDesignToken public Color TableExpandIconBg { get; set; } public double TableExpandColumnWidth { get; set; } public Color TableExpandedRowBg { get; set; } - public double TableFilterDropdownWidth { get; set; } - public double TableFilterDropdownSearchWidth { get; set; } + public int ZIndexTableFixed { get; set; } public int ZIndexTableSticky { get; set; } @@ -338,10 +344,13 @@ internal class DataGridToken : AbstractControlDesignToken TableExpandedRowBg = RowExpandedBg; // Dropdown - TableFilterDropdownWidth = 120; - TableFilterDropdownHeight = 264; - TableFilterDropdownSearchWidth = 140; - + // TODO 暂未使用 + TableFilterDropdownWidth = 120; + TableFilterDropdownHeight = 264; + TableFilterDropdownSearchWidth = 140; + TableFilterButtonSpacing = SharedToken.MarginXS; + TableFilterButtonContainerMargin = new Thickness(0, SharedToken.MarginXS, 0, SharedToken.MarginXXS); + TableFilterButtonLayoutSeparatorMargin = new Thickness(0, SharedToken.MarginXXS, 0, 0); // Virtual Scroll Bar TableScrollThumbSize = 8; TableScrollThumbBg = StickyScrollBarBg; diff --git a/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs b/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs index 115da6637..e53972cb0 100644 --- a/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs +++ b/src/AtomUI.Controls.DataGrid/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.TokenResourceKeyGenerator/TokenResourceConst.g.cs @@ -47,6 +47,9 @@ namespace AtomUI.Theme.Styling public static readonly TokenResourceKey TableExpandColumnWidth = new TokenResourceKey("DataGrid.TableExpandColumnWidth"); public static readonly TokenResourceKey TableExpandedRowBg = new TokenResourceKey("DataGrid.TableExpandedRowBg"); public static readonly TokenResourceKey TableExpandIconBg = new TokenResourceKey("DataGrid.TableExpandIconBg"); + public static readonly TokenResourceKey TableFilterButtonContainerMargin = new TokenResourceKey("DataGrid.TableFilterButtonContainerMargin"); + public static readonly TokenResourceKey TableFilterButtonLayoutSeparatorMargin = new TokenResourceKey("DataGrid.TableFilterButtonLayoutSeparatorMargin"); + public static readonly TokenResourceKey TableFilterButtonSpacing = new TokenResourceKey("DataGrid.TableFilterButtonSpacing"); public static readonly TokenResourceKey TableFilterDropdownBg = new TokenResourceKey("DataGrid.TableFilterDropdownBg"); public static readonly TokenResourceKey TableFilterDropdownHeight = new TokenResourceKey("DataGrid.TableFilterDropdownHeight"); public static readonly TokenResourceKey TableFilterDropdownSearchWidth = new TokenResourceKey("DataGrid.TableFilterDropdownSearchWidth"); diff --git a/src/AtomUI.Controls.DataGrid/Themes/DataGridColumnHeaderTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/DataGridColumnHeaderTheme.axaml index 7bf8273fc..8509f8977 100644 --- a/src/AtomUI.Controls.DataGrid/Themes/DataGridColumnHeaderTheme.axaml +++ b/src/AtomUI.Controls.DataGrid/Themes/DataGridColumnHeaderTheme.axaml @@ -36,8 +36,15 @@ IsVisible="{TemplateBinding CanUserSort}" /> + VerticalAlignment="Center"> + + + + + + + + diff --git a/src/AtomUI.Controls.DataGrid/DataGridThemeConstants.cs b/src/AtomUI.Controls.DataGrid/Themes/DataGridThemeConstants.cs similarity index 94% rename from src/AtomUI.Controls.DataGrid/DataGridThemeConstants.cs rename to src/AtomUI.Controls.DataGrid/Themes/DataGridThemeConstants.cs index f780ddacd..6fde6ff9e 100644 --- a/src/AtomUI.Controls.DataGrid/DataGridThemeConstants.cs +++ b/src/AtomUI.Controls.DataGrid/Themes/DataGridThemeConstants.cs @@ -114,4 +114,12 @@ internal static class DataGridThemeConstants internal static class DataGridTopLeftColumnHeaderThemeConstants { +} + +internal static class DataGridMenuFilterFlyoutPresenterThemeConstants +{ + public const string ButtonLayoutPart = "PART_ButtonLayout"; + public const string OkButtonPart = "PART_OkButton"; + public const string ResetButtonPart = "PART_ResetButton"; + public const string ButtonLayoutSeparatorPart = "PART_ButtonLayoutSeparator"; } \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridFilterMenuItemTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridFilterMenuItemTheme.axaml new file mode 100644 index 000000000..ded50246f --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridFilterMenuItemTheme.axaml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridMenuFilterFlyoutPresenterTheme.axaml b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridMenuFilterFlyoutPresenterTheme.axaml new file mode 100644 index 000000000..c570dc87b --- /dev/null +++ b/src/AtomUI.Controls.DataGrid/Themes/Filters/DataGridMenuFilterFlyoutPresenterTheme.axaml @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs b/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs index ac35a865a..49208b873 100644 --- a/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs +++ b/src/AtomUI.Controls.DataGrid/Utils/Converters/DataGridFilterIndicatorVisibleConvert.cs @@ -9,6 +9,13 @@ internal class DataGridFilterIndicatorVisibleConvert : IMultiValueConverter public object Convert(IList values, Type targetType, object? parameter, CultureInfo culture) { - return values.All(v => v is bool && (bool)v); + if (values.Count != 3) + { + return false; + } + bool areSeparatorsVisible = values[0] is bool b0 && b0; + bool canUserFilter = values[1] is bool b1 && b1; + int filterCount = values[2] is int count ? count : 0; + return areSeparatorsVisible && canUserFilter && filterCount > 0; } } \ No newline at end of file diff --git a/src/AtomUI.Controls/AtomUI.Controls.csproj b/src/AtomUI.Controls/AtomUI.Controls.csproj index 5240932f9..511b6202f 100644 --- a/src/AtomUI.Controls/AtomUI.Controls.csproj +++ b/src/AtomUI.Controls/AtomUI.Controls.csproj @@ -18,6 +18,7 @@ + diff --git a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml index fc63266aa..8e3596223 100644 --- a/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml +++ b/src/AtomUI.Controls/AtomUIOSSControlThemesProvider.axaml @@ -18,7 +18,7 @@ - + diff --git a/src/AtomUI.Controls/Buttons/IconButton.cs b/src/AtomUI.Controls/Buttons/IconButton.cs index 0166f15d7..241bf9f29 100644 --- a/src/AtomUI.Controls/Buttons/IconButton.cs +++ b/src/AtomUI.Controls/Buttons/IconButton.cs @@ -1,13 +1,18 @@ +using System.Diagnostics.CodeAnalysis; +using System.Reflection; using AtomUI.Animations; using AtomUI.Controls.Themes; using AtomUI.Controls.Utils; using AtomUI.IconPkg; +using AtomUI.Reflection; using AtomUI.Theme; using AtomUI.Theme.Utils; using Avalonia; using Avalonia.Animation; using Avalonia.Controls; using Avalonia.Controls.Primitives; +using Avalonia.Interactivity; +using Avalonia.Layout; using Avalonia.Media; using Avalonia.Rendering; using Avalonia.VisualTree; @@ -139,6 +144,13 @@ public class IconButton : AvaloniaButton, #endregion + #region 反射信息定义 + [DynamicDependency(DynamicallyAccessedMemberTypes.NonPublicFields, typeof(AvaloniaButton))] + private static readonly Lazy IsFlyoutOpenFieldInfo = new Lazy(() => + typeof(AvaloniaButton).GetFieldInfoOrThrow("_isFlyoutOpen", + BindingFlags.Instance | BindingFlags.NonPublic)); + #endregion + private Border? _frame; static IconButton() @@ -198,4 +210,9 @@ public class IconButton : AvaloniaButton, { return true; } + + protected bool IsFlyoutOpen() + { + return IsFlyoutOpenFieldInfo.Value.GetValue(this) as bool? ?? false; + } } \ No newline at end of file diff --git a/src/AtomUI.Controls/DatePicker/Themes/DatePickerPresenterTheme.axaml b/src/AtomUI.Controls/DatePicker/Themes/DatePickerPresenterTheme.axaml index 56a25f0d1..e8b059ddf 100644 --- a/src/AtomUI.Controls/DatePicker/Themes/DatePickerPresenterTheme.axaml +++ b/src/AtomUI.Controls/DatePicker/Themes/DatePickerPresenterTheme.axaml @@ -32,7 +32,7 @@ ButtonType="Primary" HorizontalAlignment="Right" SizeType="Small" - Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" /> + Content="{DynamicResource {x:Static localization:CommonLangResourceKey.Ok}}" /> diff --git a/src/AtomUI.Controls/DatePicker/Themes/DualMonthRangeDatePickerPresenterTheme.axaml b/src/AtomUI.Controls/DatePicker/Themes/DualMonthRangeDatePickerPresenterTheme.axaml index 126fd3752..3dba70d1f 100644 --- a/src/AtomUI.Controls/DatePicker/Themes/DualMonthRangeDatePickerPresenterTheme.axaml +++ b/src/AtomUI.Controls/DatePicker/Themes/DualMonthRangeDatePickerPresenterTheme.axaml @@ -37,7 +37,7 @@ ButtonType="Primary" HorizontalAlignment="Right" SizeType="Small" - Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" /> + Content="{DynamicResource {x:Static localization:CommonLangResourceKey.Ok}}" /> diff --git a/src/AtomUI.Controls/DatePicker/Themes/TimedRangeDatePickerPresenterTheme.axaml b/src/AtomUI.Controls/DatePicker/Themes/TimedRangeDatePickerPresenterTheme.axaml index d056cd61b..6d8bab2fb 100644 --- a/src/AtomUI.Controls/DatePicker/Themes/TimedRangeDatePickerPresenterTheme.axaml +++ b/src/AtomUI.Controls/DatePicker/Themes/TimedRangeDatePickerPresenterTheme.axaml @@ -37,7 +37,7 @@ ButtonType="Primary" HorizontalAlignment="Right" SizeType="Small" - Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" /> + Content="{DynamicResource {x:Static localization:CommonLangResourceKey.Ok}}" /> diff --git a/src/AtomUI.Controls/Flyouts/Flyout.cs b/src/AtomUI.Controls/Flyouts/Flyout.cs index 35e73a3e2..49a3ef4a6 100644 --- a/src/AtomUI.Controls/Flyouts/Flyout.cs +++ b/src/AtomUI.Controls/Flyouts/Flyout.cs @@ -210,6 +210,7 @@ public class Flyout : PopupFlyoutBase protected override void OnClosed() { + base.OnClosed(); CompositeDisposable?.Dispose(); } @@ -340,10 +341,13 @@ public class Flyout : PopupFlyoutBase return false; } - IsOpen = true; + IsOpen = true; Dispatcher.UIThread.InvokeAsync(() => { - Popup.MotionAwareOpen(() => { HandlePopupOpened(placementTarget); }); + Popup.MotionAwareOpen(() => + { + HandlePopupOpened(placementTarget); + }); }); return true; } @@ -368,8 +372,14 @@ public class Flyout : PopupFlyoutBase return base.HideCore(false); } - IsOpen = false; - Dispatcher.UIThread.InvokeAsync(() => { Popup.MotionAwareClose(HandlePopupClosed); }); + IsOpen = false; + Dispatcher.UIThread.InvokeAsync(() => + { + Popup.MotionAwareClose(() => + { + HandlePopupClosed(); + }); + }); return true; } diff --git a/src/AtomUI.Controls/Flyouts/FlyoutStateHelper.cs b/src/AtomUI.Controls/Flyouts/FlyoutStateHelper.cs index bc2cc27c5..3b5540cf5 100644 --- a/src/AtomUI.Controls/Flyouts/FlyoutStateHelper.cs +++ b/src/AtomUI.Controls/Flyouts/FlyoutStateHelper.cs @@ -170,7 +170,7 @@ internal class FlyoutStateHelper : AvaloniaObject { return; } - + FlyoutAboutToClose?.Invoke(this, EventArgs.Empty); Flyout.Hide(); } diff --git a/src/AtomUI.Controls/Flyouts/MenuFlyout.cs b/src/AtomUI.Controls/Flyouts/MenuFlyout.cs index 1a54d438d..d06448e62 100644 --- a/src/AtomUI.Controls/Flyouts/MenuFlyout.cs +++ b/src/AtomUI.Controls/Flyouts/MenuFlyout.cs @@ -63,7 +63,7 @@ public class MenuFlyout : Flyout ItemsSource = Items, [!ItemsControl.ItemTemplateProperty] = this[!ItemTemplateProperty], [!ItemsControl.ItemContainerThemeProperty] = this[!ItemContainerThemeProperty], - MenuFlyout = new WeakReference(this) + MenuFlyout = this }; BindUtils.RelayBind(this, IsShowArrowEffectiveProperty, presenter, MenuFlyoutPresenter.IsShowArrowProperty); BindUtils.RelayBind(this, IsMotionEnabledProperty, presenter, MenuFlyoutPresenter.IsMotionEnabledProperty); @@ -73,7 +73,7 @@ public class MenuFlyout : Flyout return presenter; } - private void SetupArrowPosition(Popup popup, MenuFlyoutPresenter? flyoutPresenter = null) + protected void SetupArrowPosition(Popup popup, MenuFlyoutPresenter? flyoutPresenter = null) { if (flyoutPresenter is null) { diff --git a/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs b/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs index 7980402c9..b9cd46848 100644 --- a/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs +++ b/src/AtomUI.Controls/Flyouts/MenuFlyoutPresenter.cs @@ -63,7 +63,7 @@ public class MenuFlyoutPresenter : MenuBase, remove => RemoveHandler(MenuItemClickedEvent, value); } - public WeakReference? MenuFlyout { get; set; } + public MenuFlyout? MenuFlyout { get; set; } #endregion @@ -98,11 +98,8 @@ public class MenuFlyoutPresenter : MenuBase, // DefaultMenuInteractionHandler calls this if (MenuFlyout is not null) { - if (MenuFlyout.TryGetTarget(out var menuFlyout)) - { - SelectedIndex = -1; - menuFlyout.Hide(); - } + SelectedIndex = -1; + MenuFlyout.Hide(); } } @@ -169,7 +166,7 @@ public class MenuFlyoutPresenter : MenuBase, protected override void OnApplyTemplate(TemplateAppliedEventArgs e) { base.OnApplyTemplate(e); - _arrowDecoratedBox = e.NameScope.Find(MenuFlyoutThemeConstants.RootContainerPart); + _arrowDecoratedBox = e.NameScope.Find(MenuFlyoutThemeConstants.ArrowDecoratorPart); } protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) diff --git a/src/AtomUI.Controls/Flyouts/PopupFlyoutBase.cs b/src/AtomUI.Controls/Flyouts/PopupFlyoutBase.cs index 980d8851d..b5cdb2e73 100644 --- a/src/AtomUI.Controls/Flyouts/PopupFlyoutBase.cs +++ b/src/AtomUI.Controls/Flyouts/PopupFlyoutBase.cs @@ -88,8 +88,10 @@ public abstract class PopupFlyoutBase : FlyoutBase, public static readonly StyledProperty PlacementConstraintAdjustmentProperty = Avalonia.Controls.Primitives.Popup.PlacementConstraintAdjustmentProperty.AddOwner(); - public static readonly StyledProperty IsMotionEnabledProperty - = MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); + public static readonly StyledProperty IsMotionEnabledProperty = MotionAwareControlProperty.IsMotionEnabledProperty.AddOwner(); + + public static readonly StyledProperty IsDetectMouseClickEnabledProperty = + AvaloniaProperty.Register(nameof(IsDetectMouseClickEnabled), true); public double MarginToAnchor { @@ -164,19 +166,12 @@ public abstract class PopupFlyoutBase : FlyoutBase, set => SetValue(IsMotionEnabledProperty, value); } - #endregion - - #region 内部属性定义 - - internal static readonly StyledProperty IsDetectMouseClickEnabledProperty = - AvaloniaProperty.Register(nameof(IsDetectMouseClickEnabled), true); - - internal bool IsDetectMouseClickEnabled + public bool IsDetectMouseClickEnabled { get => GetValue(IsDetectMouseClickEnabledProperty); set => SetValue(IsDetectMouseClickEnabledProperty, value); } - + #endregion #region 公共事件定义 diff --git a/src/AtomUI.Controls/Flyouts/Themes/FlyoutThemes.axaml b/src/AtomUI.Controls/Flyouts/Themes/FlyoutThemes.axaml new file mode 100644 index 000000000..bc0705afd --- /dev/null +++ b/src/AtomUI.Controls/Flyouts/Themes/FlyoutThemes.axaml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutConstants.cs b/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutConstants.cs index 28b31f8e4..774a1b056 100644 --- a/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutConstants.cs +++ b/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutConstants.cs @@ -3,5 +3,5 @@ namespace AtomUI.Controls.Themes; internal static class MenuFlyoutThemeConstants { public const string ItemsPresenterPart = "PART_ItemsPresenter"; - public const string RootContainerPart = "PART_RootContainer"; + public const string ArrowDecoratorPart = "PART_ArrowDecorator"; } \ No newline at end of file diff --git a/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.axaml b/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.axaml index 984b6cf2e..8b5e7a366 100644 --- a/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.axaml +++ b/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.axaml @@ -1,28 +1,29 @@ - - - - - - - - - - - - + + + + + + + + + + + + - - - \ No newline at end of file + + + \ No newline at end of file diff --git a/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.cs b/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.cs new file mode 100644 index 000000000..6e18e9cdf --- /dev/null +++ b/src/AtomUI.Controls/Flyouts/Themes/MenuFlyoutPresenterTheme.cs @@ -0,0 +1,7 @@ +using Avalonia.Styling; + +namespace AtomUI.Controls.Themes; + +public class MenuFlyoutPresenterTheme : ControlTheme +{ +} \ No newline at end of file diff --git a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.LanguageGenerator/LanguageResourceConst.g.cs b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.LanguageGenerator/LanguageResourceConst.g.cs index e0dbe8743..f54f094e5 100644 --- a/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.LanguageGenerator/LanguageResourceConst.g.cs +++ b/src/AtomUI.Controls/GeneratedFiles/AtomUI.Generator/AtomUI.Generator.LanguageGenerator/LanguageResourceConst.g.cs @@ -13,8 +13,9 @@ namespace AtomUI.Controls.Localization { public static class CommonLangResourceKey { - public static readonly LanguageResourceKey CancelText = new LanguageResourceKey("Common.CancelText", "AtomUI.Lang"); - public static readonly LanguageResourceKey OkText = new LanguageResourceKey("Common.OkText", "AtomUI.Lang"); + public static readonly LanguageResourceKey Cancel = new LanguageResourceKey("Common.Cancel", "AtomUI.Lang"); + public static readonly LanguageResourceKey Ok = new LanguageResourceKey("Common.Ok", "AtomUI.Lang"); + public static readonly LanguageResourceKey Reset = new LanguageResourceKey("Common.Reset", "AtomUI.Lang"); } } @@ -32,8 +33,8 @@ namespace AtomUI.Controls.PopupConfirmLang { public static class PopupConfirmLangResourceKey { - public static readonly LanguageResourceKey CancelText = new LanguageResourceKey("PopupConfirm.CancelText", "AtomUI.Lang"); - public static readonly LanguageResourceKey OkText = new LanguageResourceKey("PopupConfirm.OkText", "AtomUI.Lang"); + public static readonly LanguageResourceKey Cancel = new LanguageResourceKey("PopupConfirm.Cancel", "AtomUI.Lang"); + public static readonly LanguageResourceKey Ok = new LanguageResourceKey("PopupConfirm.Ok", "AtomUI.Lang"); } } diff --git a/src/AtomUI.Controls/Localization/en_US.cs b/src/AtomUI.Controls/Localization/en_US.cs index e44ebf375..8c0b392b5 100644 --- a/src/AtomUI.Controls/Localization/en_US.cs +++ b/src/AtomUI.Controls/Localization/en_US.cs @@ -8,6 +8,7 @@ namespace AtomUI.Controls.Localization; [LanguageProvider(LanguageCode.en_US, Constants.CommonLangID)] internal class en_US : AbstractLanguageProvider { - public const string OkText = "Ok"; - public const string CancelText = "Cancel"; + public const string Ok = "Ok"; + public const string Cancel = "Cancel"; + public const string Reset = "Reset"; } \ No newline at end of file diff --git a/src/AtomUI.Controls/Localization/zh_CN.cs b/src/AtomUI.Controls/Localization/zh_CN.cs index d3056958d..d35edd652 100644 --- a/src/AtomUI.Controls/Localization/zh_CN.cs +++ b/src/AtomUI.Controls/Localization/zh_CN.cs @@ -8,6 +8,7 @@ namespace AtomUI.Controls.Localization; [LanguageProvider(LanguageCode.zh_CN, Constants.CommonLangID)] internal class zh_CN : AbstractLanguageProvider { - public const string OkText = "确定"; - public const string CancelText = "取消"; + public const string Ok = "确定"; + public const string Cancel = "取消"; + public const string Reset = "重置"; } \ No newline at end of file diff --git a/src/AtomUI.Controls/Menu/MenuItem.cs b/src/AtomUI.Controls/Menu/MenuItem.cs index 37a68f3bb..d642f7392 100644 --- a/src/AtomUI.Controls/Menu/MenuItem.cs +++ b/src/AtomUI.Controls/Menu/MenuItem.cs @@ -124,7 +124,7 @@ public class MenuItem : AvaloniaMenuItem { if (_headerPresenterPart != null) { - _headerPresenterPart.Transitions = new Transitions() + _headerPresenterPart.Transitions = new Transitions { TransitionUtils.CreateTransition(ContentPresenter.BackgroundProperty), TransitionUtils.CreateTransition(ContentPresenter.ForegroundProperty) diff --git a/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.axaml b/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.axaml index 7ea4cb217..7d9375fc6 100644 --- a/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.axaml +++ b/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.axaml @@ -1,91 +1,90 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + - + + + + Icon="{TemplateBinding Icon}" + IsVisible="{TemplateBinding Icon, Converter={x:Static ObjectConverters.IsNotNull}}" + Grid.Column="1" /> + + - - + + + + + + + + - - - - - - - - - - + + + + + - + - + - + - + - + - - - \ No newline at end of file + + \ No newline at end of file diff --git a/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.cs b/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.cs new file mode 100644 index 000000000..2ce2f0bbb --- /dev/null +++ b/src/AtomUI.Controls/Menu/Themes/MenuItemTheme.cs @@ -0,0 +1,16 @@ +using AtomUI.Controls.Utils; +using Avalonia.Controls.Converters; +using Avalonia.Layout; +using Avalonia.Styling; + +namespace AtomUI.Controls.Themes; + +public class MenuItemTheme : ControlTheme +{ + public static readonly StringToTextBlockConverter StringToTextBlockConverter = new () + { + VerticalAlignment = VerticalAlignment.Center + }; + public static readonly PlatformKeyGestureConverter KeyGestureConverter = new(); + public static readonly ToggleItemsLayoutVisibleConverter ToggleItemsLayoutVisibleConverter = new(); +} \ No newline at end of file diff --git a/src/AtomUI.Controls/Menu/Themes/MenuThemes.axaml b/src/AtomUI.Controls/Menu/Themes/MenuThemes.axaml index 994a6fb11..aca55b183 100644 --- a/src/AtomUI.Controls/Menu/Themes/MenuThemes.axaml +++ b/src/AtomUI.Controls/Menu/Themes/MenuThemes.axaml @@ -1,11 +1,13 @@ + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" + xmlns:themes="using:AtomUI.Controls.Themes" + xmlns:atom="https://atomui.net"> - + \ No newline at end of file diff --git a/src/AtomUI.Controls/Menu/Utils/ToggleItemsLayoutVisibleConverter.cs b/src/AtomUI.Controls/Menu/Utils/ToggleItemsLayoutVisibleConverter.cs index 39a1f38ce..15f5161d0 100644 --- a/src/AtomUI.Controls/Menu/Utils/ToggleItemsLayoutVisibleConverter.cs +++ b/src/AtomUI.Controls/Menu/Utils/ToggleItemsLayoutVisibleConverter.cs @@ -4,14 +4,17 @@ using Avalonia.Data.Converters; namespace AtomUI.Controls.Utils; -internal class ToggleItemsLayoutVisibleConverter : IMultiValueConverter +public class ToggleItemsLayoutVisibleConverter : IMultiValueConverter { - public object? Convert(IList objects, Type targetType, object? parameter, CultureInfo culture) + public object? Convert(IList values, Type targetType, object? parameter, CultureInfo culture) { - var items = objects.ToList(); - if (items[0] is bool isTopLevel && items[1] is MenuItemToggleType toggleType) + if (values.Count != 3) { - return !isTopLevel && toggleType != MenuItemToggleType.None; + return false; + } + if (values[0] is bool isTopLevel && values[1] is MenuItemToggleType toggleType && values[2] is int itemCount) + { + return !isTopLevel && toggleType != MenuItemToggleType.None && itemCount == 0; } return false; diff --git a/src/AtomUI.Controls/Popup/Popup.cs b/src/AtomUI.Controls/Popup/Popup.cs index 0197960a5..0cfe7565a 100644 --- a/src/AtomUI.Controls/Popup/Popup.cs +++ b/src/AtomUI.Controls/Popup/Popup.cs @@ -133,8 +133,8 @@ public class Popup : AvaloniaPopup, public Popup() { this.BindWaveSpiritProperties(); - Closed += HandleClosed; - Opened += HandleOpened; + Closed += HandleClosed; + Opened += HandleOpened; } // Popup 好像不加入视觉树,所以我们放在逻辑树 diff --git a/src/AtomUI.Controls/PopupConfirm/Localization/en_US.cs b/src/AtomUI.Controls/PopupConfirm/Localization/en_US.cs index e83eaf484..60c6ff33e 100644 --- a/src/AtomUI.Controls/PopupConfirm/Localization/en_US.cs +++ b/src/AtomUI.Controls/PopupConfirm/Localization/en_US.cs @@ -6,6 +6,6 @@ namespace AtomUI.Controls.PopupConfirmLang; [LanguageProvider(LanguageCode.en_US, PopupConfirmToken.ID)] internal class en_US : AbstractLanguageProvider { - public const string OkText = "Ok"; - public const string CancelText = "Cancel"; + public const string Ok = "Ok"; + public const string Cancel = "Cancel"; } \ No newline at end of file diff --git a/src/AtomUI.Controls/PopupConfirm/Localization/zh_CN.cs b/src/AtomUI.Controls/PopupConfirm/Localization/zh_CN.cs index f67e6cd63..63c2b76bb 100644 --- a/src/AtomUI.Controls/PopupConfirm/Localization/zh_CN.cs +++ b/src/AtomUI.Controls/PopupConfirm/Localization/zh_CN.cs @@ -6,6 +6,6 @@ namespace AtomUI.Controls.PopupConfirmLang; [LanguageProvider(LanguageCode.zh_CN, PopupConfirmToken.ID)] internal class zh_CN : AbstractLanguageProvider { - public const string OkText = "确定"; - public const string CancelText = "取消"; + public const string Ok = "确定"; + public const string Cancel = "取消"; } \ No newline at end of file diff --git a/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs b/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs index 886295b9a..0a603587a 100644 --- a/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs +++ b/src/AtomUI.Controls/PopupConfirm/PopupConfirm.cs @@ -149,8 +149,8 @@ public class PopupConfirm : FlyoutHost, { base.OnAttachedToVisualTree(e); Flyout ??= new PopupConfirmFlyout(this); - this.AddResourceBindingDisposable(LanguageResourceBinder.CreateBinding(this, OkTextProperty, PopupConfirmLangResourceKey.OkText)); - this.AddResourceBindingDisposable(LanguageResourceBinder.CreateBinding(this, CancelTextProperty, PopupConfirmLangResourceKey.CancelText)); + this.AddResourceBindingDisposable(LanguageResourceBinder.CreateBinding(this, OkTextProperty, PopupConfirmLangResourceKey.Ok)); + this.AddResourceBindingDisposable(LanguageResourceBinder.CreateBinding(this, CancelTextProperty, PopupConfirmLangResourceKey.Cancel)); } } diff --git a/src/AtomUI.Controls/TimePicker/Themes/TimePickerPresenterTheme.axaml b/src/AtomUI.Controls/TimePicker/Themes/TimePickerPresenterTheme.axaml index 35b93e424..c49bc16d8 100644 --- a/src/AtomUI.Controls/TimePicker/Themes/TimePickerPresenterTheme.axaml +++ b/src/AtomUI.Controls/TimePicker/Themes/TimePickerPresenterTheme.axaml @@ -25,7 +25,7 @@ ButtonType="Primary" HorizontalAlignment="Right" SizeType="Small" - Content="{DynamicResource {x:Static localization:CommonLangResourceKey.OkText}}" /> + Content="{DynamicResource {x:Static localization:CommonLangResourceKey.Ok}}" />