C# WPF DatePicker水印使用了错误的语言,但Dateformat是正确的
我有一个非常奇怪的问题: 在我的机器上,日期选择器根据我要设置的语言/文化更改其水印和日期格式 如果我将应用程序复制到其他计算机,会发生以下情况: 在某些计算机上,它的工作原理与在我的机器上一样。在其他计算机上,只有日期格式更改,但水印不会更改!不用说,有一个日期选择器,比如说,有一个德国日期,但有一个英文水印,这是非常难看的 这种行为的原因是什么? 对于i18n,我使用以下代码: App.xaml.cs:C# WPF DatePicker水印使用了错误的语言,但Dateformat是正确的,c#,wpf,internationalization,datepicker,C#,Wpf,Internationalization,Datepicker,我有一个非常奇怪的问题: 在我的机器上,日期选择器根据我要设置的语言/文化更改其水印和日期格式 如果我将应用程序复制到其他计算机,会发生以下情况: 在某些计算机上,它的工作原理与在我的机器上一样。在其他计算机上,只有日期格式更改,但水印不会更改!不用说,有一个日期选择器,比如说,有一个德国日期,但有一个英文水印,这是非常难看的 这种行为的原因是什么? 对于i18n,我使用以下代码: App.xaml.cs: 公共部分类应用程序:应用程序 { 公共应用程序() { CultureInfo ci=新
公共部分类应用程序:应用程序
{
公共应用程序()
{
CultureInfo ci=新的CultureInfo(“de”);
Thread.CurrentThread.CurrentCulture=ci;
Thread.CurrentThread.CurrentUICulture=ci;
}
}
WindowMain.xaml.cs:
公共部分类WindowMain:RibbonWindow
{
公共WindowMain()
{
this.Language=XmlLanguage.GetLanguage(“de”);
this.InitializeComponent();
}
}
有一件事我可以说,水印
在日期选取器
中实现了错误,不容易访问。也许,由于这个困难,文本的本地化不起作用。@Matt Hamilton
有一篇精彩的文章,引自:
但是,很多人(包括我自己)不喜欢DatePicker的一点是,默认情况下,如果没有显示日期,它会显示文本“Select a date”作为水印,并且该文本会被烘焙到控件中-它不会本地化,也不会被任何公共属性访问。如果所讨论的日期是可选的,并且您不一定要提示用户选择一个,那么这尤其令人沮丧
在同一篇文章中,他提供了如何访问水印
的决策。在这里:
@Wayne Maurer
以附加依赖属性的形式创建了一个通用解决方案:
<DatePicker Grid.Row="2"
local:DatePickerWatermarkBehaviour.Watermark="Select the date" />
设置带水印的文本实际上非常容易:
<DatePicker>
<DatePicker.Resources>
<Style TargetType="DatePickerTextBox">
<Setter Property="Text" Value="Watermark Text"/>
</Style>
</DatePicker.Resources>
</DatePicker>
Wayne解决方案非常有效,但当DatePicker是DataGridColumnHeader的一部分时,有时当DatePicker处于先隐藏后可见的控件上时,则不起作用。Matt Hamilton的解决方案只能在加载时工作,当您更改selectedDate时,会再次出现令人恼火的选择日期水印。最简单的解决方案就是在自定义类中重写OnRender事件。如果设置了水印属性而不是水印内容,则还需要覆盖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;
}
}
}
}
}
谢谢你的回答!它提供了相当多的信息,但是它没有解释为什么本地化在某些机器上实际起作用。M:是的,我同意这很奇怪。在有操作系统的机器上?它们是相同的操作系统还是不同的操作系统?2台机器有WinXP 2台机器Win7。1台win xp和1台win7机器工作。其他人没有。所以这不是操作系统。但这两台工作机器都安装了VisualStudio。我的是VS2012 pro,另一个是VS2010 express。有没有可能我忘记了将一些程序集复制到用户计算机上,因为它可以在开发人员计算机上工作?如果是:哪一个?@M C:我认为正确的说法是,
DatePicker
的开发者。我怀疑在不同操作系统的情况下。对于通用解决方案,我建议通过附加的依赖属性或most设置水印中的文本,以使日期选择器
控件成为,因为它是带有文本框
的按钮
(打开日历
)。如果我(曾经)发现是什么让datepicker本地化在特定的计算机上工作/失败,我会在这里发布。太棒了!你知道如何改变文字的颜色吗?前景不工作。这不会改变水印,它实际上设置了文本。使用键盘将日期输入控件时,会导致不同的行为。
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;
}
}
}
}
}