本文实例为大家分享了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; } } } } |
效果图:
转载于:https://www.cnblogs.com/sjqq/p/7891256.html