好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WPF自定义选择年月控件详解

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

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

?

< UserControl x:Class = "SunCreate.CombatPlatform.Client.DateMonthPicker"

   xmlns = "http://schemas.microsoft测试数据/winfx/2006/xaml/presentation"

   xmlns:x = "http://schemas.microsoft测试数据/winfx/2006/xaml"

   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 >

后台代码:

 

?

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;

       }

     }

   }

}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://HdhCmsTestcnblogs测试数据/s0611163/p/7573774.html

dy("nrwz");

查看更多关于WPF自定义选择年月控件详解的详细内容...

  阅读:47次