Windows应用商店日期选择器null日期 [英] windows store app date picker null date

查看:61
本文介绍了Windows应用商店日期选择器null日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在窗口存储应用程序Windows 8中使用datepicker,但是我找不到任何控件,所以我使用了它:

i need datepicker in window store app , windows 8, but i am not able to find any control, so i used this :

jasonmitchell/WinRT-XAML-DatePicker

https://github.com/jasonmitchell/WinRT-XAML-DatePicker/blob/master/Samples/WinRTDatePicker.Samples.sln

但是我的问题是,默认情况下,它显示今天的日期,如果用户未应用任何日期,我不想显示任何日期,

but my problem is , by default it shows today date, that i don't want, i don't want to show any date, if user did not apply any date

如果有人有想法在Windows Metro应用程序中使用日期选择器,那将很棒,

if anybody have idea to working with date-picker in windows metro application, that will be great,

我知道Windows 8.1具有该控件,但现在无法移动到Windows 8.1!

i know windows 8.1 have that control but i cannot moved to windows 8.1 now!

代码示例:

  <WinRTDatePicker:DatePicker IsEnabled="True" x:Name="dtActualFinishDate" Width="370"/>

    i want to set value if 

    if (Booking.ActualToDteTme.HasValue)
                {
                    dtActualFinishDate.SelectedDate = Booking.ActualToDteTme.Value;
    }

因此,如果ActualToDteTme具有任何值,我想应用否则,我需要将datepicker保留为空白,

so if ActualToDteTme have any value, i want to apply otherwise, i need to keep datepicker is as blank,

现在它显示为当前日期,当我单击更新"时,它更新了当前日期!这不是正确的行为!!

for now it is show as currect date, and when i click on Update, it updated current date !! that's not right behaviour!!

谢谢

推荐答案

我给您更新的DatePicker& SelectedDateChangedEventArgs类.请改用Github中的这些类.我添加了默认的月",日期",年"占位符文本.默认值为空&如果有人选择了占位符文本,则该文本也将为null.

I am giving you updated DatePicker & SelectedDateChangedEventArgs class. Use these classes instead from Github. I have added default "month", "date", "year" placeholder text. Default value will be null & if anyone selects placeholder text then also it will be null.

using System;
using System.Collections.ObjectModel;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;

namespace WinRTDatePicker
{
    [TemplatePart(Name = "_DayOptions", Type = typeof(ComboBox))]
    [TemplatePart(Name = "_MonthOptions", Type = typeof(ComboBox))]
    [TemplatePart(Name = "_YearOptions", Type = typeof(ComboBox))]
    public sealed class DatePicker : Control
    {
        public static readonly DependencyProperty SelectedDateProperty = DependencyProperty.Register("SelectedDate", typeof(DateTime?), typeof(DatePicker), new PropertyMetadata(default(DateTime?), SelectedDateChangedCallback));
        public static readonly DependencyProperty DayOptionFormatProperty = DependencyProperty.Register("DayOptionFormat", typeof(string), typeof(DatePicker), new PropertyMetadata(default(string)));
        public static readonly DependencyProperty MonthOptionFormatProperty = DependencyProperty.Register("MonthOptionFormat", typeof(string), typeof(DatePicker), new PropertyMetadata(default(string)));

        public event EventHandler<SelectedDateChangedEventArgs> SelectedDateChanged; 

        private readonly ObservableCollection<string> daysInRange = new ObservableCollection<string>();
        private readonly ObservableCollection<string> monthsInRange = new ObservableCollection<string>();
        private readonly ObservableCollection<string> yearsInRange = new ObservableCollection<string>();

        public DatePicker()
        {
            DefaultStyleKey = typeof(DatePicker);

            //SelectedDate = DateTime.Today;
            DayOptionFormat = "dd dddd";
            MonthOptionFormat = "MMMM";
        }

        protected override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            monthsInRange.Clear();
            monthsInRange.Add("Month");
            for (int i = 1; i <= 12; i++)
            {
                DateTime monthStart = new DateTime(DateTime.Now.Year, i, 1);
                monthsInRange.Add(monthStart.ToString(MonthOptionFormat));
            }

            CreateBindings();
            SetSelectedDate(SelectedDate);

            DayOptions.SelectionChanged += DayOptionsOnSelectionChanged;
            MonthOptions.SelectionChanged += MonthOptionsOnSelectionChanged;
            YearOptions.SelectionChanged += YearOptionsOnSelectionChanged;
        }

        private void SetSelectedDate(DateTime? newSelectedDate)
        {
            if (DayOptions != null && MonthOptions != null && YearOptions != null)
            {
                var TempNewSelectedDate = newSelectedDate;
                if (newSelectedDate == null)
                {
                    newSelectedDate = DateTime.Today;
                }
                daysInRange.Clear();
                yearsInRange.Clear();

                daysInRange.Add("Date");
                for (int i = 1; i <= DateTime.DaysInMonth(newSelectedDate.Value.Year, newSelectedDate.Value.Month); i++)
                {
                    DateTime date = new DateTime(newSelectedDate.Value.Year, newSelectedDate.Value.Month, i);
                    daysInRange.Add(date.ToString(DayOptionFormat));
                }

                int minYear = newSelectedDate.Value.Year - 10;
                int maxYear = newSelectedDate.Value.Year + 10;

                yearsInRange.Add("Year");
                for (int i = minYear; i <= maxYear; i++)
                {
                    yearsInRange.Add(i.ToString());
                }

                if (TempNewSelectedDate != null)
                {
                    DayOptions.SelectedIndex = newSelectedDate.Value.Day;
                    MonthOptions.SelectedIndex = newSelectedDate.Value.Month;
                    YearOptions.SelectedItem = newSelectedDate.Value.Year.ToString();
                }

                else
                {
                    DayOptions.SelectedIndex = 0;
                    MonthOptions.SelectedIndex = 0;
                    YearOptions.SelectedIndex = 0;
                }
            }
        }

        private void CreateBindings()
        {
            Binding dayOptionsBinding = new Binding { Source = daysInRange, Mode = BindingMode.OneWay };
            DayOptions.SetBinding(ItemsControl.ItemsSourceProperty, dayOptionsBinding);

            Binding monthOptionsBinding = new Binding { Source = monthsInRange, Mode = BindingMode.OneWay };
            MonthOptions.SetBinding(ItemsControl.ItemsSourceProperty, monthOptionsBinding);

            Binding yearOptionsBinding = new Binding { Source = yearsInRange, Mode = BindingMode.OneWay };
            YearOptions.SetBinding(ItemsControl.ItemsSourceProperty, yearOptionsBinding);
        }

        private void UpdateSelectedDateFromInputs()
        {
            if (YearOptions.SelectedIndex > 0 && MonthOptions.SelectedIndex > 0 && DayOptions.SelectedIndex > 0)
            {
                int year = int.Parse(YearOptions.SelectedValue.ToString());
                int month = MonthOptions.SelectedIndex;
                int day = DayOptions.SelectedIndex;

                int maxDaysInMonth = DateTime.DaysInMonth(year, month);
                if (day > maxDaysInMonth)
                {
                    day = maxDaysInMonth;
                    DayOptions.SelectedIndex = maxDaysInMonth - 1;
                }

                if (month == 0)
                    month = 1;

                if (day == 0)
                    day = 1;

                SelectedDate = new DateTime(year, month, day);
            }
            else if (YearOptions.SelectedIndex == 0 && MonthOptions.SelectedIndex == 0 && DayOptions.SelectedIndex == 0)
            {
                SelectedDate = null;
            }
        }

        private void UpdateDayOptions()
        {
            if (SelectedDate != null)
            {
                int selectedDayIndex = DayOptions.SelectedIndex;
                int month = MonthOptions.SelectedIndex;

                if (month != 0)
                {
                    daysInRange.Clear();
                    daysInRange.Add("Date");
                    for (int i = 1; i <= DateTime.DaysInMonth(SelectedDate.Value.Year, month); i++)
                    {
                        DateTime date = new DateTime(SelectedDate.Value.Year, month, i);
                        daysInRange.Add(date.ToString(DayOptionFormat));
                    }

                    DayOptions.SelectedIndex = selectedDayIndex;  
                }
            }
        }

        private void DayOptionsOnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
        {
            UpdateSelectedDateFromInputs();
        }

        private void MonthOptionsOnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
        {
            UpdateSelectedDateFromInputs();
            UpdateDayOptions();
        }

        private void YearOptionsOnSelectionChanged(object sender, SelectionChangedEventArgs selectionChangedEventArgs)
        {
            UpdateSelectedDateFromInputs();
            UpdateDayOptions();
        }

        private static void SelectedDateChangedCallback(DependencyObject obj, DependencyPropertyChangedEventArgs args)
        {
            DateTime oldValue = args.OldValue != null ? (DateTime)args.OldValue : DateTime.Today.AddDays(-1);
            DateTime? newValue = (DateTime?)args.NewValue;

            if (newValue != oldValue)
            {
                DatePicker datePicker = (DatePicker)obj;
                datePicker.SetSelectedDate(newValue);

                if (datePicker.SelectedDateChanged != null)
                    datePicker.SelectedDateChanged(datePicker, new SelectedDateChangedEventArgs(newValue));
            }
        }

        public DateTime? SelectedDate
        {
            get { return (DateTime?)GetValue(SelectedDateProperty); }
            set { SetValue(SelectedDateProperty, value); }
        }

        public string DayOptionFormat
        {
            get { return (string)GetValue(DayOptionFormatProperty); }
            set { SetValue(DayOptionFormatProperty, value); }
        }

        public string MonthOptionFormat
        {
            get { return (string)GetValue(MonthOptionFormatProperty); }
            set { SetValue(MonthOptionFormatProperty, value); }
        }

        private ComboBox DayOptions
        {
            get { return (ComboBox)GetTemplateChild("_DayOptions"); }
        }

        private ComboBox MonthOptions
        {
            get { return (ComboBox)GetTemplateChild("_MonthOptions"); }
        }

        private ComboBox YearOptions
        {
            get { return (ComboBox)GetTemplateChild("_YearOptions"); }
        }
    }
}

using System;

namespace WinRTDatePicker
{
    public class SelectedDateChangedEventArgs : EventArgs
    {
        private readonly DateTime? newDate;

        public SelectedDateChangedEventArgs(DateTime? newDate)
        {
            this.newDate = newDate;
        }

        public DateTime? NewDate
        {
            get { return newDate; }
        }
    }
}

这篇关于Windows应用商店日期选择器null日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆