zoukankan      html  css  js  c++  java
  • WPF自定义选择年月控件详解

    本文实例为大家分享了WPF自定义选择年月控件的具体代码,供大家参考,具体内容如下

    封装了一个选择年月的控件,XAML代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    <UserControl x:Class="SunCreate.CombatPlatform.Client.DateMonthPicker"
      Height="23" Loaded="UserControl_Loaded">
      <UserControl.Resources>
        <ResourceDictionary>
          <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/SunCreate.CombatPlatform.Client.Resources;Component/Resource/DateTimePickerResource.xaml" />
          </ResourceDictionary.MergedDictionaries>
          <Style TargetType="ToggleButton" x:Key="stlToggleButton">
            <Setter Property="Foreground" Value="White"></Setter>
            <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate>
                  <Border x:Name="Back" Background="Transparent" BorderThickness="0" BorderBrush="Transparent">
                    <Path Name="PathFill" Fill="#1b94e0" Width="8" Height="6" StrokeThickness="0" Data="M5,0 L10,10 L0,10 z" RenderTransformOrigin="0.5,0.5" Stretch="Fill">
                      <Path.RenderTransform>
                        <TransformGroup>
                          <ScaleTransform/>
                          <SkewTransform/>
                          <RotateTransform Angle="180"/>
                          <TranslateTransform/>
                        </TransformGroup>
                      </Path.RenderTransform>
                    </Path>
                  </Border>
                  <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                      <Setter TargetName="PathFill" Property="Fill" Value="#1b94e0"></Setter>
                      <Setter TargetName="Back" Property="Background" Value="Transparent"></Setter>
                      <Setter TargetName="Back" Property="BorderBrush" Value="Transparent"></Setter>
                    </Trigger>
                  </ControlTemplate.Triggers>
                </ControlTemplate>
              </Setter.Value>
            </Setter>
          </Style>
          <Style TargetType="ComboBox" x:Key="stlComboBox">
            <Setter Property="SnapsToDevicePixels" Value="True"/>
            <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto"/>
            <Setter Property="ScrollViewer.CanContentScroll" Value="True"/>
            <Setter Property="HorizontalAlignment" Value="Left"></Setter>
            <Setter Property="Foreground" Value="Black"></Setter>
            <Setter Property="Height" Value="30"></Setter>
            <Setter Property="Margin" Value="0,0,0,0"></Setter>
            <Setter Property="Template">
              <Setter.Value>
                <ControlTemplate TargetType="ComboBox">
                  <Grid>
                    <Grid.Background>
                      <ImageBrush ImageSource="/SunCreate.CombatPlatform.Client.Resources;component/Image/Face/1比n人脸比对/输入框.png"/>
                    </Grid.Background>
                    <Grid.ColumnDefinitions>
                      <ColumnDefinition Width="0.7*"/>
                      <ColumnDefinition Width="0.3*" MaxWidth="30" MinWidth="18"/>
                    </Grid.ColumnDefinitions>
                    <TextBox Grid.Column="0" IsReadOnly="True" Foreground="#1ba4f6" BorderThickness="1" BorderBrush="Transparent" Text="{TemplateBinding Text}" Background="Transparent"></TextBox>
                    <Border Grid.Column="0" BorderThickness="0" Background="Transparent">
                    </Border>
                    <Border Grid.Column="1" BorderThickness="0" CornerRadius="0,1,1,0" Background="Transparent">
                      <ToggleButton Style="{StaticResource stlToggleButton}" IsChecked="{Binding Path=IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" ClickMode="Press"></ToggleButton>
                    </Border>
                    <Popup IsOpen="{TemplateBinding IsDropDownOpen}" Placement="Bottom" x:Name="Popup" Focusable="False" AllowsTransparency="True" PopupAnimation="Slide">
                      <Border CornerRadius="1" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{TemplateBinding ActualWidth}" x:Name="DropDown" SnapsToDevicePixels="True" Background="Transparent">
                        <Border.Effect>
                          <DropShadowEffect Color="#1ba4f6" BlurRadius="2" ShadowDepth="0" Opacity="0.5"/>
                        </Border.Effect>
                        <ScrollViewer Margin="4,6,4,6" Style="{DynamicResource ScrollViewerStyle}" MaxHeight="{TemplateBinding MaxDropDownHeight}" SnapsToDevicePixels="True" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto" CanContentScroll="True">
                          <!-- StackPanel 用于显示子级,方法是将 IsItemsHost 设置为 True -->
                          <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" Background="#1ba4f6"/>
                        </ScrollViewer>
                      </Border>
                    </Popup>
                  </Grid>
                </ControlTemplate>
              </Setter.Value>
            </Setter>
          </Style>
        </ResourceDictionary>
      </UserControl.Resources>
      <Grid>
        <StackPanel Orientation="Horizontal">
          <ComboBox Grid.Column ="2" Grid.Row="0" Name="cbYear" SelectionChanged="cbYear_SelectionChanged" SelectedValuePath="Text" DisplayMemberPath="Text" Height="25" Width="55" Style="{StaticResource stlComboBox}" VerticalAlignment ="Center" >
          </ComboBox>
          <TextBlock Text="年" Margin="5 0 5 0" VerticalAlignment="Center" Foreground="#1ba4f6" />
          <ComboBox Grid.Column ="2" Grid.Row="0" Name="cbMonth" SelectionChanged="cbMonth_SelectionChanged" SelectedValuePath="Text" DisplayMemberPath="Text" Height="25" Width="40" Style="{StaticResource stlComboBox}" VerticalAlignment ="Center" >
          </ComboBox>
          <TextBlock Text="月" Margin="5 0 5 0" VerticalAlignment="Center" Foreground="#1ba4f6" />
        </StackPanel>
      </Grid>
    </UserControl>

    后台代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.ComponentModel;
     
    namespace SunCreate.CombatPlatform.Client
    {
      /// <summary>
      ///
      /// </summary>
      public partial class DateMonthPicker : UserControl, INotifyPropertyChanged
      {
        private DateTime _selectedMonth;
        public static DependencyProperty selectedTimeProperty;
     
        static DateMonthPicker()
        {
          selectedTimeProperty = DependencyProperty.Register("SelectedMonth", typeof(DateTime), typeof(DateMonthPicker), new PropertyMetadata(DateTime.Now, new PropertyChangedCallback(SelectedMonthChanged)));
        }
     
        public DateMonthPicker()
        {
          InitializeComponent();
     
          int currentYear = DateTime.Now.Year;
          int currentMonth = DateTime.Now.Month;
          List<object> yearList = new List<object>();
          for (int i = currentYear - 20; i <= currentYear; i++)
          {
            yearList.Add(new { Text = i.ToString() });
          }
          cbYear.ItemsSource = yearList;
     
          cbMonth.ItemsSource = new List<object>() {
            new { Text = "1" },
            new { Text = "2" },
            new { Text = "3" },
            new { Text = "4" },
            new { Text = "5" },
            new { Text = "6" },
            new { Text = "7" },
            new { Text = "8" },
            new { Text = "9" },
            new { Text = "10" },
            new { Text = "11" },
            new { Text = "12" }};
     
          this._selectedMonth = DateTime.Now;
        }
     
        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
          cbYear.SelectedValue = _selectedMonth.Year.ToString();
          cbMonth.SelectedValue = _selectedMonth.Month.ToString();
        }
     
        private static void SelectedMonthChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
        {
          (obj as DateMonthPicker).ChangeSelect(e.NewValue);
        }
     
        private void ChangeSelect(object value)
        {
          _selectedMonth = (DateTime)value;
          cbYear.SelectedValue = _selectedMonth.Year.ToString();
          cbMonth.SelectedValue = _selectedMonth.Month.ToString();
        }
     
        public DateTime SelectedMonth
        {
          get { return (DateTime)this.GetValue(DateMonthPicker.selectedTimeProperty); }
          set { this.SetValue(DateMonthPicker.selectedTimeProperty, value); }
        }
     
        public DateTime StartDay
        {
          get
          {
            return this._selectedMonth.AddDays(1 - this._selectedMonth.Day).Date;
          }
        }
     
        public DateTime EndDay
        {
          get
          {
            return this.StartDay.AddMonths(1).AddDays(-1);
          }
        }
     
        #region INotifyPropertyChanged 成员
        public event PropertyChangedEventHandler PropertyChanged;
        private void SendPropertyChanged(String propertyName)
        {
          if (PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
     
        private void cbYear_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          ComboBox cb = sender as ComboBox;
          if (this._selectedMonth != DateTime.MinValue && cb.SelectedValue != null)
          {
            this._selectedMonth = new DateTime(Convert.ToInt32(cb.SelectedValue), this._selectedMonth.Month, 1);
            SelectedMonth = this._selectedMonth;
          }
        }
     
        private void cbMonth_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          ComboBox cb = sender as ComboBox;
          if (this._selectedMonth != DateTime.MinValue && cb.SelectedValue != null)
          {
            this._selectedMonth = new DateTime(this._selectedMonth.Year, Convert.ToInt32(cb.SelectedValue), 1);
            SelectedMonth = this._selectedMonth;
          }
        }
      }
    }

    效果图:

  • 相关阅读:
    【Java】基本类型和引用类型(值传递)
    Linux学习笔记:什么是x86
    Java volatile keyword
    C语言可变參实现參数累加返回
    [Network]Application Layer
    linux下select,poll,epoll的使用与重点分析
    卷积神经网络(CNN)基础介绍
    ScrollView嵌套ExpandableListView显示不正常的问题
    【leetcode】 Unique Binary Search Trees II (middle)☆
    【leetcode】 Unique Binary Search Trees (middle)☆
  • 原文地址:https://www.cnblogs.com/sjqq/p/7891256.html
Copyright © 2011-2022 走看看