Пользовательский элемент управления WPF Custom DatePicker - PullRequest
0 голосов
/ 28 августа 2011

Я хочу создать пользовательский элемент управления для получения даты от пользователя.Он должен иметь три текстовых поля, одно для года, месяца и дня.Я не знаю, как его создать.

<UserControl x:Class="UI.WPF.CustomControls.ChooseDateControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         x:Name="chooseDateControl"
         xmlns:custom="clr-namespace:UI.WPF.CustomControls"
         d:DesignHeight="26" d:DesignWidth="181" FontFamily="Tahoma">

<DockPanel LastChildFill="True">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1.5*" />
            <ColumnDefinition Width="14" />
            <ColumnDefinition Width="1*" />
            <ColumnDefinition Width="14" />
            <ColumnDefinition Width="1*" />
        </Grid.ColumnDefinitions>

        <Label Content="/" Grid.Column="1" />
        <Label Content="/" Grid.Column="3" />

        <custom:NumericTextBox x:Name="txtYear" ToolTip="سال" Text="{Binding ElementName=chooseDateControl, Mode=TwoWay, Path=Year}" MaxLength="4" TabIndex="2" MinWidth="20" />
        <custom:NumericTextBox x:Name="txtMonth" Grid.Column="2" ToolTip="ماه" Text="{Binding ElementName=chooseDateControl, Mode=TwoWay, Path=Month}" MaxLength="2" TabIndex="1" MinWidth="20" />
        <custom:NumericTextBox x:Name="txtDay" Grid.Column="4" ToolTip="روز" Text="{Binding ElementName=chooseDateControl, Mode=TwoWay, Path=Day}" MaxLength="2" TabIndex="0" MinWidth="20" />
    </Grid>
</DockPanel>

Код позади

public partial class ChooseDateControl : UserControl
{
    public static readonly DependencyProperty ValueProperty;
    public static readonly DependencyProperty YearProperty;
    public static readonly DependencyProperty MonthProperty;
    public static readonly DependencyProperty DayProperty;

    static ChooseDateControl()
    {
        ValueProperty = DependencyProperty.Register(
            "Value",
            typeof(DateTime), typeof(ChooseDateControl),
            new FrameworkPropertyMetadata(DateTime.MinValue));

        ValueProperty = DependencyProperty.Register(
            "Year",
            typeof(int), typeof(ChooseDateControl),
            new FrameworkPropertyMetadata((int)0));

        ValueProperty = DependencyProperty.Register(
            "Month",
            typeof(int), typeof(ChooseDateControl),
            new FrameworkPropertyMetadata((int)0));

        ValueProperty = DependencyProperty.Register(
            "Day",
            typeof(int), typeof(ChooseDateControl),
            new FrameworkPropertyMetadata((int)0));
    }

    public ChooseDateControl()
    {
        InitializeComponent();
    }

    public DateTime Value
    {
        get
        {
            return (DateTime)base.GetValue(ValueProperty);
        }
        set
        {
            base.SetValue(ValueProperty, value);
        }
    }

    public int Year
    {
        get
        {
            return (int)base.GetValue(YearProperty);
        }
        set
        {
            base.SetValue(YearProperty, value);
        }
    }

    public int Month
    {
        get
        {
            return (int)base.GetValue(MonthProperty);
        }
        set
        {
            base.SetValue(MonthProperty, value);
        }
    }

    public int Day
    {
        get
        {
            return (int)base.GetValue(DayProperty);
        }
        set
        {
            base.SetValue(DayProperty, value);
        }
    }
}

Это не работает правильно -он возвращает значение по умолчанию, которое является DateTime.MinValue.Пожалуйста, помогите мне.

Ответы [ 4 ]

1 голос
/ 29 августа 2011

Возможно, было бы лучше написать логику вроде этого:

static void Main(string[] args)
{
    Console.WriteLine("Year");
    var year = Int32.Parse(Console.ReadLine());
    Console.WriteLine("Month");
    var month = Int32.Parse(Console.ReadLine());
    Console.WriteLine("Day");
    var day = Int32.Parse(Console.ReadLine());

    var customDate = new DateTime(year, month, day);

    Console.WriteLine(customDate);
    Console.ReadLine();
}

Вы можете реализовать нечто подобное, например, иметь кнопку, которая при нажатии получит значения и создаст новое значение даты-времени.Есть много способов генерирования DateTime из входных значений, просто просматривайте веб-страницы, и вы найдете множество примеров и учебников по этому вопросу в WPF.Надеюсь, это даст вам некоторые идеи и поможет вам.

0 голосов
/ 29 августа 2011

У вас нет текстовых полей, связанных с вашим свойством зависимости.Значение никогда не устанавливается.Вам нужен какой-то тип конвертера, который также преобразует значения в ваших текстовых полях в фактическую дату.Я думаю, вам лучше использовать DatePicker Control в наборе инструментов (3.5) или в фреймворке (4.0).

0 голосов
/ 29 августа 2011

Для начала прекратите копирование и вставку: 0).Все ваши регистрации DP для ValueProperty.И вам придется обрабатывать обратный вызов измененного свойства для каждого свойства, чтобы также обновить свойство Value.

0 голосов
/ 28 августа 2011

Почему бы просто не использовать элементы управления Calendar или DatePicker в WPF Toolkit ?Вы не упомянули ничего в своем вопросе, что является обычаем, так что это должно работать нормально для вас.

...