6

我有一个非常奇怪的问题:

在我的机器上,DatePicker 根据我要设置的语言/文化更改其水印和日期格式。

如果我将我的应用程序复制到其他计算机,则会发生以下情况:

在某些计算机上,它就像在我的机器上一样工作。在其他计算机上,只有日期格式会改变,但水印不会!不用说,拥有一个带有例如德国日期但带有英文水印的日期选择器是非常难看的。

这种行为的原因是什么?

对于 i18n,我使用以下代码:

应用程序.xaml.cs:

public partial class App : Application
{
    public App()
    {
        CultureInfo ci = new CultureInfo("de-DE"); 
        Thread.CurrentThread.CurrentCulture = ci;
        Thread.CurrentThread.CurrentUICulture = ci;
    }
}

WindowMain.xaml.cs:

public partial class WindowMain : RibbonWindow
{
    public WindowMain()
    {
        this.Language = XmlLanguage.GetLanguage("de-DE");
        this.InitializeComponent();
    }
}
4

3 回答 3

8

设置带水印的文字其实很简单:

<DatePicker>
  <DatePicker.Resources>
    <Style TargetType="DatePickerTextBox">
      <Setter Property="Text" Value="Watermark Text"/>
    </Style>
  </DatePicker.Resources>
</DatePicker>

http://www.admindiaries.com/change-datepicker-watermark-in-wpf/

于 2015-05-23T11:27:53.937 回答
5

我可以说一件事,WatermarkDatePicker实施的越野车中,没有简单的访问。也许,因为这个困难,文本的本地化不起作用。有一篇精彩的文章@Matt Hamilton,引用自这里

但是,很多人(包括我自己)不喜欢 DatePicker 的一点是,默认情况下,如果没有显示日期,它会显示文本“选择日期”作为水印,并且此文本会被烘焙到控件中- 它不是本地化的,也不能被任何公共财产访问。如果所讨论的日期是可选的并且您不一定要提示您的用户选择一个,这尤其令人沮丧。

在同一篇文章中,他提供了如何访问Watermark. 这里:

如何本地化 WPF 4.0 DatePicker 控件

@Wayne Maurer以附加依赖属性的形式创建了一个通用解决方案:

<DatePicker Grid.Row="2" 
            local:DatePickerWatermarkBehaviour.Watermark="Select the date" />

您需要基于当前的文化,设置水印的文本,例如使用上面的示例。

Note:在 SilverlightWatermarkDatePicker访问 [ link]:

DatePickerTextBox box = base.GetTemplateChild("TextBox") as DatePickerTextBox;
box.Watermark = "Type or select a date --> "; 
于 2013-09-03T10:24:24.757 回答
3

Wayne 解决方案效果很好,但当 DatePicker 是 DataGridColumnHeader 的一部分时不起作用,有时当 DatePicker 处于先隐藏然后可见的控件上时。Matt Hamilton 的解决方案仅适用于 onLoad,当您更改 selectedDate 时,再次出现烦人的 Select a date watermark。最简单的解决方案就是在自定义类中覆盖 OnRender 事件。如果您设置 watermark 属性而不是您需要覆盖 onload 事件的水印内容。完整的课程在这里:

public class myDateTimePicker : DatePicker
{

    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 watermark";
                }

                // if you set property this way then you need to override OnSelectedDateChanged event
                //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;
                }
            }
        }
    }

}
于 2015-06-04T14:04:50.580 回答