WPF工具包DatePicker更改默认值'show calendar'

时间:2009-07-09 05:52:57

标签: datepicker wpftoolkit

我正在使用最新的 WPF工具包,特别是DatePicker。一切正常,但是当没有提供任何值时,默认的“SHOW CALENDAR”文本出现在DatePickerTextBox中。 我希望能够在WPF中更改此值。

有人告诉我下载源代码,添加一个新的Dependency属性并重新编译为dll。这很酷但是如果新版本发布会怎么样?

这就是为什么我想以这种方式模板化这个控件,我将能够覆盖这个默认字符串。知道怎么做吗?

谢谢!

4 个答案:

答案 0 :(得分:22)

行。我自己找到了解决方案。

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

无论如何,你必须知道这个事实,即有一个名为Watermark的DependencyProperty应该被设置来代替Text。

问题在于,最新的MS发布(大约在2009年6月),由于某些未知原因,他们将此属性 readonly 。这意味着,这是我组建的唯一黑客,虽然发生了首次异常,因为DatePicker试图解析字符串(他假设文本是一个日期),但通常你不会注意到它。

另一种可能性是直接编辑MS的源代码和覆盖 SetWaterMark()方法+添加您自己的依赖属性(MyWaterMark或其他)。但是你不能使用提供的dll。他们表示将使用.NET 4 realese修复 ,让我们看看。

答案 1 :(得分:6)

    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事件。

答案 2 :(得分:0)

这很有用但你也必须在自定义类中覆盖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;
                }
            }
        }
    }

答案 3 :(得分:0)

你也可以这样做:

使用以下设置向表单添加文本框和日期选择器:

在你的window.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");
    }

结果如下所示:klick