You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Avalonia移除按钮按下动画方法咨询(优先C#代码实现)

移除Avalonia UI按钮按下时的动画效果(C#代码实现)

Avalonia UI中按钮的按下动画是默认控件模板里的VisualState动画,要移除它最直接的方式是重写按钮的控件模板,或者修改视觉状态配置。以下是三种优先用C#代码实现的方案:

方案1:为单个按钮移除按下动画

通过动态创建自定义样式并应用到目标按钮,替换默认模板以移除Pressed状态的动画:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Media;

// 假设你的目标按钮实例名为targetButton
var customButtonStyle = new Style(x => x.OfType<Button>())
{
    Setters =
    {
        new Setter(Button.TemplateProperty, ControlTemplate.Create<Button>(button =>
        {
            return new Border
            {
                // 保留按钮核心内容展示
                Child = new ContentPresenter
                {
                    Name = "PART_ContentPresenter",
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment = VerticalAlignment.Center,
                    [!ContentPresenter.ContentProperty] = button[!Button.ContentProperty]
                },
                // 绑定按钮原有样式属性,保证基础外观一致
                Background = button[!Button.BackgroundProperty],
                BorderBrush = button[!Button.BorderBrushProperty],
                BorderThickness = button[!Button.BorderThicknessProperty],
                CornerRadius = button[!Button.CornerRadiusProperty],
                Padding = button[!Button.PaddingProperty]
            };
        }))
    }
};

// 将样式添加到目标按钮的资源集合,仅作用于该按钮
targetButton.Styles.Add(customButtonStyle);

方案2:全局移除所有按钮的按下动画

如果需要所有按钮都移除按下动画,可将自定义样式添加到应用全局资源中:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Media;

// 在App.xaml.cs的OnFrameworkInitializationCompleted方法中添加
var globalButtonStyle = new Style(x => x.OfType<Button>())
{
    Setters =
    {
        new Setter(Button.TemplateProperty, ControlTemplate.Create<Button>(button =>
        {
            return new Border
            {
                Child = new ContentPresenter
                {
                    Name = "PART_ContentPresenter",
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment = VerticalAlignment.Center,
                    [!ContentPresenter.ContentProperty] = button[!Button.ContentProperty]
                },
                Background = button[!Button.BackgroundProperty],
                BorderBrush = button[!Button.BorderBrushProperty],
                BorderThickness = button[!Button.BorderThicknessProperty],
                CornerRadius = button[!Button.CornerRadiusProperty],
                Padding = button[!Button.PaddingProperty]
            };
        }))
    }
};

Application.Current.Styles.Add(globalButtonStyle);

方案3:保留其他状态样式(如Hover)仅移除按下动画

如果需要保留指针悬浮等状态的样式,可在自定义模板中添加VisualStateManager,仅清空Pressed状态的动画/样式变化:

using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using Avalonia.Media;

var buttonStyleWithHover = new Style(x => x.OfType<Button>())
{
    Setters =
    {
        new Setter(Button.TemplateProperty, ControlTemplate.Create<Button>(button =>
        {
            var border = new Border
            {
                Child = new ContentPresenter
                {
                    Name = "PART_ContentPresenter",
                    HorizontalAlignment = HorizontalAlignment.Center,
                    VerticalAlignment = VerticalAlignment.Center,
                    [!ContentPresenter.ContentProperty] = button[!Button.ContentProperty]
                },
                Background = button[!Button.BackgroundProperty],
                BorderBrush = button[!Button.BorderBrushProperty],
                BorderThickness = button[!Button.BorderThicknessProperty],
                CornerRadius = button[!Button.CornerRadiusProperty],
                Padding = button[!Button.PaddingProperty]
            };

            // 配置视觉状态,保留Hover效果,移除Pressed动画
            VisualStateManager.SetVisualStateGroups(border, new VisualStateGroupList
            {
                new VisualStateGroup
                {
                    Name = "CommonStates",
                    States =
                    {
                        new VisualState { Name = "Normal" },
                        new VisualState
                        {
                            Name = "PointerOver",
                            Setters = { new Setter(Border.BackgroundProperty, Brushes.LightGray) }
                        },
                        new VisualState { Name = "Pressed" }, // 无任何样式/动画设置
                        new VisualState { Name = "Disabled" }
                    }
                }
            });

            return border;
        }))
    }
};

targetButton.Styles.Add(buttonStyleWithHover);

以上方案通过重写控件模板或视觉状态配置,彻底移除了按钮按下时的默认动画,同时保证按钮的基础功能和样式不受影响。

内容的提问来源于stack exchange,提问作者SmMicrolab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:52:29