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

    效果图:

  • 相关阅读:
    HDU 2108 Shape of HDU (判断是不是凸多边形 叉乘)
    三,对于printf函数和C语言编程的初步拓展
    二,养成良好的写代码习惯
    一,彻底理解第一个C语言程序 Hello World
    归并排序(看了别人的博客明白了也写个博客,希望这样不算抄袭~)
    汉诺塔
    最小生成树
    堆排序
    二叉排序树
    双关键字快排
  • 原文地址:https://www.cnblogs.com/sjqq/p/7891256.html
Copyright © 2011-2022 走看看