Browse Source

自定义控件-优化自定义步进器控件

ZhouJieSheng 2 năm trước cách đây
mục cha
commit
3018d7a1ec

+ 67 - 26
PDF Office/CustomControl/NumericUpDown.xaml

@@ -1,28 +1,69 @@
-<UserControl x:Class="PDF_Office.CustomControl.NumericUpDown"
-            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
-             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
-             xmlns:local="clr-namespace:PDF_Office.CustomControl"
-             mc:Ignorable="d" 
-             d:DesignHeight="40" d:DesignWidth="80">
-    <Grid>
-        <Grid.ColumnDefinitions>
-            <ColumnDefinition Width="4*"/>
-            <ColumnDefinition Width="1*"/>
-        </Grid.ColumnDefinitions>
-        <TextBox Name="TextBox_Num" Grid.Column="0" Text="1" FontSize="20" TextAlignment="Center" MinWidth="80" MinHeight="20" VerticalContentAlignment="Center" TextChanged="TextBox_Num_TextChanged" InputMethod.IsInputMethodEnabled="False"  PreviewTextInput="CountTextBox_PreviewTextInput" />
-        <Grid Grid.Column="1">
-            <Grid.RowDefinitions>
-                <RowDefinition/>
-                <RowDefinition/>
-            </Grid.RowDefinitions>
-            <Button Name="Button_Add" Grid.Row="0" Click="Button_Add_Click" Background="White">
-                <Path  VerticalAlignment="Center" HorizontalAlignment="Center" Stroke="Black"  Data="M0 8L4 1 L8 8" Height="10" Stretch="Fill" Visibility="{Binding CompressLargeStyle}"/>
-            </Button>
-            <Button Name="Button_Sub" Grid.Row="1"   Click="Button_Sub_Click" Background="White">
-                <Path  VerticalAlignment="Center" HorizontalAlignment="Center" Stroke="Black"  Data="M0 8L4 16 L8 8" Height="10" Stretch="Fill" Visibility="{Binding CompressLargeStyle}"/>
-            </Button>
+<UserControl
+    x:Class="PDF_Office.CustomControl.NumericUpDown"
+    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
+    xmlns:local="clr-namespace:PDF_Office.CustomControl"
+    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
+    d:DesignHeight="40"
+    d:DesignWidth="80"
+    Background="#EEEEEE"
+    FontSize="20"
+    mc:Ignorable="d">
+    <Border>
+        <Grid>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="*" />
+                <ColumnDefinition Width="auto" />
+            </Grid.ColumnDefinitions>
+            <TextBox
+                Name="TextBox_Num"
+                MinWidth="80"
+                MinHeight="20"
+                Padding="16,0,0,0"
+                VerticalContentAlignment="Center"
+                Background="Transparent"
+                BorderThickness="0"
+                FontFamily="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:NumericUpDown}, Path=FontFamily}"
+                FontSize="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:NumericUpDown}, Path=FontSize}"
+                Foreground="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:NumericUpDown}, Path=Foreground}"
+                InputMethod.IsInputMethodEnabled="False"
+                PreviewTextInput="CountTextBox_PreviewTextInput"
+                Text="1"
+                TextAlignment="Left"
+                TextChanged="TextBox_Num_TextChanged" />
+            <Grid Grid.Column="1" Width="20">
+                <Grid.RowDefinitions>
+                    <RowDefinition />
+                    <RowDefinition />
+                </Grid.RowDefinitions>
+                <Button
+                    Name="Button_Add"
+                    Grid.Row="0"
+                    Background="Transparent"
+                    BorderBrush="Transparent"
+                    BorderThickness="0"
+                    Click="Button_Add_Click">
+                    <Path
+                        HorizontalAlignment="Center"
+                        Data="M8 4.29102L2.14648 10.1445L2.85547 10.8535L8 5.70898L13.1445 10.8535L13.8535 10.1445L8 4.29102Z"
+                        Fill="Black"
+                        Stretch="Uniform"
+                        Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:NumericUpDown}, Path=ShowBtn}" />
+                </Button>
+                <Button
+                    Name="Button_Sub"
+                    Grid.Row="1"
+                    Background="Transparent"
+                    BorderThickness="00"
+                    Click="Button_Sub_Click">
+                    <Path
+                        Data="M13.8535 5.85547L13.1445 5.14648L8 10.291L2.85547 5.14648L2.14648 5.85547L8 11.709L13.8535 5.85547Z"
+                        Fill="Black"
+                        Stretch="Uniform"
+                        Visibility="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:NumericUpDown}, Path=ShowBtn}" />
+                </Button>
+            </Grid>
         </Grid>
-    </Grid>
+    </Border>
 </UserControl>

+ 142 - 37
PDF Office/CustomControl/NumericUpDown.xaml.cs

@@ -21,24 +21,116 @@ namespace PDF_Office.CustomControl
     /// </summary>
     public partial class NumericUpDown : UserControl
     {
-        public int Num
+        //public int Num
+        //{
+        //    get
+        //    {
+        //        int value = 0;
+        //        this.Dispatcher.Invoke(new Action(() =>
+        //            value = Convert.ToInt32(this.TextBox_Num.Text.Trim())
+        //        ));
+        //        return value;
+        //    }
+        //    set
+        //    {
+        //        this.Dispatcher.Invoke(new Action(() =>
+        //        {
+        //            this.TextBox_Num.Text = value.ToString();
+        //        }));
+        //    }
+        //}
+
+        public string Text
         {
-            get
-            {
-                int value = 0;
-                this.Dispatcher.Invoke(new Action(() =>
-                    value = Convert.ToInt32(this.TextBox_Num.Text.Trim())
-                ));
-                return value;
-            }
-            set
-            {
-                this.Dispatcher.Invoke(new Action(() =>
+            get { return (string)GetValue(TextProperty); }
+            set { SetValue(TextProperty, value); }
+        }
+
+        public static readonly DependencyProperty TextProperty =
+            DependencyProperty.Register("Text", typeof(string), typeof(NumericUpDown), new PropertyMetadata(""));
+
+
+        /// <summary>
+        /// 当前值
+        /// </summary>
+        public double Value
+        {
+            get { return (double)GetValue(ValueProperty); }
+            set { 
+                if (value > Maximum)
+                {
+                    SetValue(ValueProperty, Maximum);
+                }
+                else if (value < Minimum)
+                {
+                    SetValue(ValueProperty, Minimum);
+                }
+                else
                 {
-                    this.TextBox_Num.Text = value.ToString();
-                }));
+                    SetValue(ValueProperty, value);
+                    TextBox_Num.Text = Value.ToString();
+                }
             }
         }
+
+        public static readonly DependencyProperty ValueProperty =
+            DependencyProperty.Register("Value", typeof(double), typeof(NumericUpDown), new PropertyMetadata(0.0));
+
+
+        /// <summary>
+        /// 最大值
+        /// </summary>
+        public double Maximum
+        {
+            get { return (double)GetValue(MaximumProperty); }
+            set { SetValue(MaximumProperty, value); }
+        }
+
+        public static readonly DependencyProperty MaximumProperty =
+            DependencyProperty.Register("Maximum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(9999.0));
+
+
+
+        /// <summary>
+        /// 最小值
+        /// </summary>
+        public double Minimum
+        {
+            get { return (double)GetValue(MinimumProperty); }
+            set { SetValue(MinimumProperty, value); }
+        }
+
+        public static readonly DependencyProperty MinimumProperty =
+            DependencyProperty.Register("Minimum", typeof(double), typeof(NumericUpDown), new PropertyMetadata(0.0));
+
+
+        /// <summary>
+        /// 增长步长
+        /// </summary>
+
+        public double TickFrequency
+        {
+            get { return (double)GetValue(TickFrequencyProperty); }
+            set { SetValue(TickFrequencyProperty, value); }
+        }
+
+        public static readonly DependencyProperty TickFrequencyProperty =
+            DependencyProperty.Register("TickFrequency", typeof(double), typeof(NumericUpDown), new PropertyMetadata(1.0));
+
+
+
+        public Visibility ShowBtn
+        {
+            get { return (Visibility)GetValue(ShowBtnProperty); }
+            set { SetValue(ShowBtnProperty, value); }
+        }
+
+        public static readonly DependencyProperty ShowBtnProperty =
+            DependencyProperty.Register("ShowBtn", typeof(Visibility), typeof(NumericUpDown), new PropertyMetadata(Visibility.Visible));
+
+
+
+
         public NumericUpDown()
         {
             InitializeComponent();
@@ -46,45 +138,58 @@ namespace PDF_Office.CustomControl
 
         private void Button_Add_Click(object sender, RoutedEventArgs e)
         {
-            int num = int.Parse(this.TextBox_Num.Text.Trim());
-            if (num > 0)
+            int num = 0;
+            double targetvalue = 0;
+            bool result = int.TryParse(this.TextBox_Num.Text.Trim(), out num);
+            if (result)
+            {
+                targetvalue = num + TickFrequency;
+            }
+            else
+            {
+                targetvalue = Maximum;
+            }
+            if(targetvalue>Maximum)
             {
-                this.TextBox_Num.Text = (num + 1).ToString();
-                Text = this.TextBox_Num.Text;
+                targetvalue = Maximum;
             }
+            this.TextBox_Num.Text = targetvalue.ToString();
+            Text = this.TextBox_Num.Text;
+            Value = targetvalue;
         }
 
         private void Button_Sub_Click(object sender, RoutedEventArgs e)
         {
-            int num = int.Parse(this.TextBox_Num.Text.Trim());
-            if (num > 0)
+            int num = 0;
+            double targetvalue = 0;
+            bool result = int.TryParse(this.TextBox_Num.Text.Trim(), out num);
+            if (result)
             {
-                if ((num - 1) == 0)
-                    return;
-                this.TextBox_Num.Text = (num - 1).ToString();
-                Text = this.TextBox_Num.Text;
+                targetvalue = num - TickFrequency;
+            }
+            else
+            {
+                targetvalue = Minimum;
             }
-        }
-
-
 
-        public string Text
-        {
-            get { return (string)GetValue(TextProperty); }
-            set { SetValue(TextProperty, value); }
+            if(targetvalue<Minimum)
+            {
+                targetvalue = Minimum;
+            }
+            this.TextBox_Num.Text = targetvalue.ToString();
+            Text = this.TextBox_Num.Text;
+            Value = targetvalue;
         }
 
-        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
-        public static readonly DependencyProperty TextProperty =
-            DependencyProperty.Register("Text", typeof(string), typeof(NumericUpDown), new PropertyMetadata(""));
-
         private void TextBox_Num_TextChanged(object sender, TextChangedEventArgs e)
         {
-            if (this.TextBox_Num.Text == "" || int.Parse(this.TextBox_Num.Text) < 1)
+            int num = 0;
+            if (this.TextBox_Num.Text == "" || !int.TryParse(this.TextBox_Num.Text,out num))
             {
-                this.TextBox_Num.Text = "1";
+                this.TextBox_Num.Text = Minimum.ToString();
             }
             Text = this.TextBox_Num.Text;
+            Value = int.Parse(this.TextBox_Num.Text);
         }
 
         private void CountTextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)