本文实例为大家分享了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; } } } } |
效果图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!