WPF инструментарий DatePicker изменить значение по умолчанию «Показать календарь» - PullRequest
10 голосов
/ 09 июля 2009

Я использую последний WPF инструментарий , в частности DatePicker. Все работает нормально, но когда значение не указано, в DatePickerTextBox появляется текст «ПОКАЗАТЬ КАЛЕНДАРЬ» по умолчанию. Я хочу иметь возможность изменить это значение в WPF.

Один из них сказал мне скачать исходный код, добавить новое свойство зависимости и перекомпилировать в dll. Это круто, но что, если выйдет новая версия?

Вот почему я хотел бы шаблонировать этот элемент управления таким образом, чтобы я мог переопределить эту строку по умолчанию. Есть идеи, как это сделать?

Спасибо!

Ответы [ 4 ]

22 голосов
/ 09 июля 2009

OK. Я сам нашел решение.

<Style TargetType="{x:Type toolkit:DatePickerTextBox}">
    <Setter Property="Text" Value="Bitte wählen" />
</Style>

В любом случае, вы должны знать о факте , что существует свойство DependencyProperty под названием Watermark, которое должно быть установлено вместо текста.

Проблема заключается в том, что в последнем выпуске MS (около июня 2009 г.) они сделали это свойство readonly по неизвестной причине. Это означает, что это единственный взлом, который я придумал, хотя и возникает исключение в первый раз, потому что DatePicker пытается проанализировать строку (он предполагает, что текст является датой), но обычно вы этого не замечаете.

Другая возможность - редактировать исходный код непосредственно из MS и переопределить метод SetWaterMark() + добавить собственное свойство зависимости (MyWaterMark или что-то в этом роде). Но тогда вы не можете использовать предоставленный dll. Они сказали, что это будет исправлено с версией .NET 4 , давайте посмотрим.

6 голосов
/ 04 ноября 2010
    void _datePicker1_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
    {
        if (_datePicker1.SelectedDate != null) return;

        FieldInfo fiTextBox = typeof(DatePicker)
            .GetField("_textBox", BindingFlags.Instance | BindingFlags.NonPublic);

        if (fiTextBox != null)
        {
            DatePickerTextBox dateTextBox =
              (DatePickerTextBox)fiTextBox.GetValue(_datePicker1);

            if (dateTextBox != null)
            {
                PropertyInfo piWatermark = dateTextBox.GetType()
                  .GetProperty("Watermark", BindingFlags.Instance | BindingFlags.NonPublic);

                if (piWatermark != null)
                {
                    piWatermark.SetValue(dateTextBox, "", null);
                }
            }
        }
    }

вам нужно также подключить событие Load с тем же кодом.

0 голосов
/ 09 мая 2017

Вы также можете сделать это:

Добавьте текстовое поле и средство выбора даты в форму со следующими настройками:

В вашем окне. Xaml:

<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="22" Margin="38,38,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
    <DatePicker x:Name="datePicker" HorizontalAlignment="Left" Margin="130,37,0,0" VerticalAlignment="Top" Width="28" BorderBrush="Transparent" SelectedDateChanged="datePicker_SelectedDateChanged"/>

А в вашем window.xaml.cs:

private void datePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e)
    {
        textBox.Text = datePicker.SelectedDate.Value.ToString("dd.MM.yyyy");
    }

Результат выглядит так: клик

0 голосов
/ 04 июня 2015

это прекрасно работает, но вам также придется переопределить метод onrender в пользовательском классе. В этом методе, если вы устанавливаете содержание водяного знака, а не свойство, нет необходимости переопределять событие OnSelectedDateChanged. Полный код здесь:

    public string Watermark { get; set; }

    protected override void OnSelectedDateChanged(SelectionChangedEventArgs e)
    {
        base.OnSelectedDateChanged(e);
        //SetWatermark();
    }

    protected override void OnRender(System.Windows.Media.DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);
        SetWatermark();
    }

    private void SetWatermark()
    {
        FieldInfo fiTextBox = typeof(DatePicker).GetField("_textBox", BindingFlags.Instance | BindingFlags.NonPublic);
        if (fiTextBox != null)
        {
            DatePickerTextBox dateTextBox = (DatePickerTextBox)fiTextBox.GetValue(this);
            if (dateTextBox != null)
            {
                if (string.IsNullOrWhiteSpace(this.Watermark))
                {
                    this.Watermark = "Custom select a date";
                }

                //PropertyInfo piWatermark = typeof(DatePickerTextBox).GetProperty("Watermark", BindingFlags.Instance | BindingFlags.NonPublic);
                //if (piWatermark != null)
                //{
                //    piWatermark.SetValue(dateTextBox, this.Watermark, null);
                //}

                var partWatermark = dateTextBox.Template.FindName("PART_Watermark", dateTextBox) as ContentControl;
                if (partWatermark != null)
                {
                    partWatermark.Foreground = new SolidColorBrush(Colors.Gray);
                    partWatermark.Content = this.Watermark;
                }
            }
        }
    }
...