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;
          }
        }
      }
    }

    效果图:

  • 相关阅读:
    MQ、JMS以及ActiveMQ 关系的理解
    java对象 深度克隆(不实现Cloneable接口)和浅度克隆
    crontab 各参数详解及如何查看日志记录
    mybatis xml 文件中like模糊查询
    jexl2 执行字符串Java代码
    java代码执行字符串中的逻辑运算方法
    mybatis 传入多个参数
    mybatis通用mapper源码解析(二)
    mybatis通用mapper源码解析(一)
    mybatise插件反向生成数据库表相关Java代码
  • 原文地址:https://www.cnblogs.com/sjqq/p/7891256.html
Copyright © 2011-2022 走看看