WPF UI开发教程可重复执行按钮

92 篇文章 9 订阅
92 篇文章 24 订阅

开发项目中有一个需求,当鼠标按住Button时,产生连续触发增加文本框加减数字。不需要每点一次Button加减数字,需要用到RepeatButton按钮,该控件功能是按住Button事件可重复执行的按钮。

该控件中有两个重要属性

Delay:从用户按下鼠标左键到开始重复发送click事件的延迟时间.单位为毫秒 Delay数值必须大于等于0

Interval:当用户按下鼠标左键时,每次发出Click事件的时间间隔.单位为毫秒 Interval数值必须大于等于0

WPF UI开发教程可重复执行按钮

 

1:RepeatButton按钮样式代码和按钮差不多:

<Style TargetType="{x:Type nb:NbRepeatButton}">
        <Setter Property="DisabledCursor" Value="No"/>
        <Setter Property="MaskBackground" Value="Transparent"/>
        <Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisualStyle}"/>
        <Setter Property="Background" Value="{StaticResource Nb.DefaultBtn.Background}" />
        <Setter Property="Foreground" Value="{StaticResource Nb.DefaultBtn.Foreground}" />
        <Setter Property="MinWidth" Value="50" />
        <Setter Property="MinHeight" Value="36" />
        <Setter Property="FontSize" Value="{StaticResource Nb.FontSize.28}" />
        <Setter Property="Margin" Value="0,0,0,0" />
        <Setter Property="CornerRadius" Value="8" />        
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="VerticalContentAlignment" Value="Center"/>
        <Setter Property="Padding" Value="0"/>
        <Setter Property="Cursor" Value="Hand"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type nb:NbRepeatButton}">
                    <Border x:Name="border"
                            BorderBrush="{TemplateBinding BorderBrush}" 
                            BorderThickness="{TemplateBinding BorderThickness}" 
                            Background="{TemplateBinding Background}" 
                            CornerRadius="{TemplateBinding CornerRadius}"
                            Effect="{TemplateBinding Effect}"
                            SnapsToDevicePixels="True">
                        <Border x:Name="innerBorder" 
                                Background="{TemplateBinding MaskBackground}" 
                                CornerRadius="{TemplateBinding CornerRadius}" 
                                SnapsToDevicePixels="True">
                            <ContentPresenter x:Name="contentPresenter" 
                                ContentTemplate="{TemplateBinding ContentTemplate}" 
                                Content="{TemplateBinding Content}" 
                                ContentStringFormat="{TemplateBinding ContentStringFormat}" 
                                Focusable="False" 
                                HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                                Margin="{TemplateBinding Padding}" 
                                RecognizesAccessKey="True" 
                                SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                                VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
                        </Border>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsEnabled" Value="False">
                <Setter Property="Opacity" Value="0.6"/>
            </Trigger>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="MaskBackground" Value="{StaticResource Nb.DefaultBtn.OverBackground}"/>
            </Trigger>
            <Trigger Property="IsPressed" Value="True">
                <Setter Property="MaskBackground" Value="{StaticResource Nb.DefaultBtn.PressedBackground}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
/// <summary>
    /// 按下事件可重复执行的按钮
    /// </summary>
    public class NbRepeatButton : RepeatButton
    {
        #region ctor
        static NbRepeatButton()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(NbRepeatButton), new FrameworkPropertyMetadata(typeof(NbRepeatButton)));
        }

        /// <summary>
        /// 
        /// </summary>
        public NbRepeatButton()
        {
            IsHitTestVisibleInChrome = true;
        }
        #endregion

        #region prop
        /// <summary>
        /// 非客户区鼠标/触摸响应
        /// </summary>
        public bool IsHitTestVisibleInChrome
        {
            get { return WindowChrome.GetIsHitTestVisibleInChrome(this); }
            set { WindowChrome.SetIsHitTestVisibleInChrome(this, value); }
        }
        #endregion

        #region dp prop
        /// <summary>
        /// 圆角
        /// </summary>
        public CornerRadius CornerRadius
        {
            get { return (CornerRadius)GetValue(CornerRadiusProperty); }
            set { SetValue(CornerRadiusProperty, value); }
        }

        // Using a DependencyProperty as the backing store for CornerRadius.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty CornerRadiusProperty =
            DependencyProperty.Register("CornerRadius", typeof(CornerRadius), typeof(NbRepeatButton), new PropertyMetadata(new CornerRadius(0d)));

        /// <summary>
        /// 遮罩层背景色(用于鼠标移入和点击按钮时背景色变化)
        /// </summary>
        public Brush MaskBackground
        {
            get { return (Brush)GetValue(MaskBackgroundProperty); }
            set { SetValue(MaskBackgroundProperty, value); }
        }

        // Using a DependencyProperty as the backing store for MaskBackground.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MaskBackgroundProperty =
            DependencyProperty.Register("MaskBackground", typeof(Brush), typeof(NbRepeatButton), new PropertyMetadata(Brushes.Transparent));


        /// <summary>
        /// 禁用时鼠标的样式
        /// </summary>
        public Cursor DisabledCursor
        {
            get { return (Cursor)GetValue(DisabledCursorProperty); }
            set { SetValue(DisabledCursorProperty, value); }
        }

        // Using a DependencyProperty as the backing store for DisabledCursor.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DisabledCursorProperty =
            DependencyProperty.Register("DisabledCursor", typeof(Cursor), typeof(NbRepeatButton), new PropertyMetadata(Cursors.No, (d, e) =>
            {
                var ele = (UIElement)d;
                ele.AddAdorner(new DisabledAdorner(ele, (Cursor)e.NewValue));
            }));    

        #endregion

        #region override
        /// <summary>
        /// 
        /// </summary>
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            this.AddAdorner(new DisabledAdorner(this, DisabledCursor));
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="e"></param>
        protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e)
        {
            base.OnPropertyChanged(e);
            NbAnimationHelper.SetOnPropertyChangedAnimation(this, e);
        }
        #endregion
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值