【问题标题】:wpf datepicker start from year in calendarwpf datepicker 从日历中的年份开始
【发布时间】:2014-07-08 05:43:29
【问题描述】:

我有standart datepicker,mvvm。

<Custom:DatePicker>
     <Custom:DatePicker.CalendarStyle>
            <Style TargetType="Custom:Calendar" >                                       
                <Setter Property="DisplayMode"  Value="Year"/>                      
            </Style>                        
     </Custom:DatePicker.CalendarStyle>
</Custom:DatePicker>

但它不起作用。我应该在 xaml 和 DatePicker 控件中有代码,而不是 Calendar+TextBlock。

【问题讨论】:

  • 从日历中的年份开始?你的意思是显示格式?
  • 日历的DisplayMode(在日历日期选择区域),不是datepicker PART_TextBox 文本
  • 可以分享更多关于Custom:DatePicker的信息吗?如果有的话,也许分享一个链接。

标签: c# wpf mvvm datepicker


【解决方案1】:

由于DatePicker在打开弹窗之前控制changesDisplayMode的值CalendarMonth,所以你的风格值变得毫无用处。

我已经在附加属性的帮助下解决了这个问题

以下代码适用于标准DatePicker 控件

<DatePicker xmlns:l="clr-namespace:CSharpWPF">
    <DatePicker.CalendarStyle>
        <Style TargetType="Calendar"
               BasedOn="{StaticResource {x:Type Calendar}}">
            <Setter Property="l:CalendarHelper.DisplayMode"
                    Value="Year" />
        </Style>
    </DatePicker.CalendarStyle>
</DatePicker>

我创建了一个附加属性CalendarHelper.DisplayMode 并在样式中设置了所需的值。

日历助手类

namespace CSharpWPF
{
    public class CalendarHelper : DependencyObject
    {
        public static CalendarMode GetDisplayMode(DependencyObject obj)
        {
            return (CalendarMode)obj.GetValue(DisplayModeProperty);
        }

        public static void SetDisplayMode(DependencyObject obj, CalendarMode value)
        {
            obj.SetValue(DisplayModeProperty, value);
        }

        // Using a DependencyProperty as the backing store for DisplayMode.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty DisplayModeProperty =
            DependencyProperty.RegisterAttached("DisplayMode", typeof(CalendarMode), typeof(CalendarHelper), new PropertyMetadata(CalendarMode.Month, OnModeChanged));

        private static void OnModeChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            Calendar cal = d as Calendar;
            cal.IsKeyboardFocusWithinChanged += (ss, ee) => cal.SetValue(Calendar.DisplayModeProperty, e.NewValue);
        }
    }
}

在上面的课程中,我正在收听日历的IsKeyboardFocusWithinChanged 事件并在处理程序中设置所需的属性值。此事件在弹出窗口打开后发生,因此将保留所需的模式。

【讨论】:

  • @KyloRen 的答案在发布之前已经过测试,您可能会使用您可能编写的一些示例代码创建一个新问题。
  • 其他日期选择器样式会干扰这个吗?如果我能做到这一点,我会支持你的答案,因为没有其他人有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 2010-11-09
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多