Установка DisplayDateStart по умолчанию для всех DatePickers - PullRequest
0 голосов
/ 15 ноября 2018

Существует установленная дата начала, которую я хочу применить для каждого DatePicker в моем приложении, потому что повторять следующий фрагмент не очень хорошая идея.

<DatePicker SelectedDate="{Binding Date}"
            DisplayDateStart="05/01/2006"/>

Так же как и установка DisplayDateStart по умолчанию в одном месте, мне нужно иметь возможность привязать свойство SelectedDate DatePicker.

Я попытался создать пользовательский элемент управления UserControl, но нажатие на значок календаря ничего не делает (ну, текстовое поле мигает, но не появляется всплывающее окно календаря)

<UserControl x:Class="MyWpfAdd.ModDatePicker"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <DockPanel>
        DatePicker x:Name="DatePicker" DisplayDateStart="05/01/2006"/>
    </DockPanel>
</UserControl>

С базовым кодом:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace MyWpfApp
{
  public partial class ModDatePicker : UserControl
  {
    public DateTime? SelectedDate
    {
      get => (DateTime?)GetValue(SelectedDateProperty);
      set
      {
        this.DatePicker.SelectedDate = value;
        SetValue(SelectedDateProperty, value);
      }
    }

    public static readonly DependencyProperty SelectedDateProperty =
      DependencyProperty.Register("SelectedDate", typeof(DateTime?), typeof(ModDatePicker), new PropertyMetadata(null));

    public DateTime? DisplayDateEnd
    {
      get => (DateTime?)GetValue(DisplayDateEndProperty);
      set
      {
        this.DatePicker.DisplayDateEnd = value;
        SetValue(DisplayDateEndProperty, value);
      }
    }

    public static readonly DependencyProperty DisplayDateEndProperty =
      DependencyProperty.Register("DisplayDateEnd", typeof(DateTime?), typeof(ModDatePicker), new PropertyMetadata(null));

    public ModDatePicker()
    {
      InitializeComponent();
    }
  }
}

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Прежде всего создайте класс со статическим свойством, которое обеспечивает необходимую дату по умолчанию:

public static class DatePickerHelper
{
    private static DateTime defaultDisplayDateStart = new DateTime(2006, 1, 5);

    public static DateTime DefaultDisplayDateStart
    {
        get
        {
            return defaultDisplayDateStart;
        }
    }
}

Затем используйте его в глобальном стиле по умолчанию для DatePicker s:

<Application x:Class="WpfApp1.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:WpfApp1"

             StartupUri="MainWindow.xaml">
    <Application.Resources>
        <Style TargetType="{x:Type DatePicker}" BasedOn="{StaticResource {x:Type DatePicker}}">
            <Setter Property="DisplayDateStart" Value="{x:Static local:DatePickerHelper.DefaultDisplayDateStart}" />
        </Style>
    </Application.Resources>
</Application>

Надеюсь, этот совет поможет вам

0 голосов
/ 15 ноября 2018

Объект PropertyMetadata принимает значение по умолчанию в качестве первого аргумента.Укажите свою дату там ...

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace MyWpfApp
{
  public partial class ModDatePicker : UserControl
  {
    public DateTime? SelectedDate
    {
      get => (DateTime?)GetValue(SelectedDateProperty);
      set
      {
        this.DatePicker.SelectedDate = value;
        SetValue(SelectedDateProperty, value);
      }
    }

    public static readonly DependencyProperty SelectedDateProperty =
      DependencyProperty.Register("SelectedDate", typeof(DateTime?), typeof(ModDatePicker), new PropertyMetadata(null));

    public DateTime? DisplayDateEnd
    {
      get => (DateTime?)GetValue(DisplayDateEndProperty);
      set
      {
        this.DatePicker.DisplayDateEnd = value;
        SetValue(DisplayDateEndProperty, value);
      }
    }

    public static readonly DependencyProperty DisplayDateEndProperty =
      DependencyProperty.Register("DisplayDateEnd", typeof(DateTime?), typeof(ModDatePicker), new PropertyMetadata(new DateTime(2006,5,1)));

    public ModDatePicker()
    {
      InitializeComponent();
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...