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; } } } } |
效果图:
WPF自定义选择年月控件详解的更多相关文章
- IOS—UITextFiled控件详解
IOS—UITextFiled控件详解 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGR ...
- ToolBar控件详解
ToolBar控件详解 在Activity中添加ToolBar 1.添加库 dependencies { ... compile "com.android.support:appcompat ...
- Spinner控件详解
Spinner控件详解 效果图 修改Spinner样式 在介绍之前,先看一下系统原生的样式 6.x & 5.x系统样式 4.x系统样式 官方文档 XML属性 方法 描述 android:dro ...
- Android开发:文本控件详解——TextView(一)基本属性
一.简单实例: 新建的Android项目初始自带的Hello World!其实就是一个TextView. 在activity_main.xml中可以新建TextView,从左侧组件里拖拽到右侧预览界面 ...
- C++ CComboBox控件详解
转载:http://blog.sina.com.cn/s/blog_46d93f190100m395.html C++ CComboBox控件详解 (2010-09-14 14:03:44) 转载▼ ...
- picker控件详解与使用,(实现省市的二级联动)
picker控件详解与使用,(实现省市的二级联动) 第一步:新建一个单视图(single view)的工程, 命名为pickerTest,不要勾选下面两个选项,第一个是新版本里面的,第二个是单元测试, ...
- Switch控件详解
Switch控件详解 原生效果 5.x 4.x 布局 <Switch android:id="@+id/setting_switch" android:layout_widt ...
- Android开发:文本控件详解——TextView(二)文字跑马灯效果实现
一.需要使用的属性: 1.android:ellipsize 作用:若文字过长,控制该控件如何显示. 对于同样的文字“Android开发:文本控件详解——TextView(二)文字跑马灯效果实现”,不 ...
- Android输入控件详解
输入控件 输入控件是您的应用用户界面中的交互式组件.Android 提供了多种可在 UI 中使用的控件,如按钮.文本字段.定位栏.复选框.缩放按钮.切换按钮等. 向 UI 中添加输入控件与向 XML ...
随机推荐
- UnionFind(PYthon实现)
UnionFind用于解决图的连通性问题,不需要给出具体路径的情况,可用来计算连通分支数 参考链接: https://blog.csdn.net/dm_vincent/article/details/ ...
- sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果
select [value] = stuff((select ','+modmb003 from modmb detail where modmb=18 for xml path('')), 1, ...
- javascript 移动鼠标高亮显示改行
主要用到两个事件 onmouseover onmouseout <!DOCTYPE html> <html> <head> <meta charset=&qu ...
- PHP二维数组排序研究
前几天在项目中碰到了一个问题,在做商城的时候,要对一个店铺里所有商品进行价格排序,而且每一种商品都拥有多个规格,要取到所有商品中所有规格的最低价和最高价,发现PHP有很友好的函数帮助我们进行筛选. 使 ...
- 常用的Linux系统命令
一.linux简介 ...
- [TJOI2014] Alice and Bob
非常好的一道思维性题目,想了很久才想出来qwq(我好笨啊) 考虑a[]数组有什么用,首先可以yy出一些性质 (设num[i]为原来第i个位置的数是什么 , 因为题目说至少有一个排列可以满足a[],所以 ...
- css :before 和 :after
:before p:before 在每个 <p> 元素的内容之前插入内容. 2 :after p:after 在每个 <p> 元素的内容之后插入内容. 2 <!DOCTY ...
- Windows网络编程 2 【转】
Windows网络编程使用winsock.Winsock是一个基于Socket模型的API,在Windows系统中广泛使用.使用Winsock进行网络编程需要包含头文件Winsock2.h,需要使用库 ...
- 深入浅出AOP(四)--AOP的实现步骤
AOP是什么?有什么用处?怎么实现?在前面的博客中已经写的非常具体了,那么我们怎么一步一步考虑的呢? 在最初的时候,我们知道AOP是一个拦截业务.提供服务的东西.于是我们是这样做的: 后来又了加上了S ...
- [Python] SQLBuilder 演示样例代码
用Python写一个SQLBuilder.Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到. 附 ...