Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF DatePicker水印使用了错误的语言,但Dateformat是正确的_C#_Wpf_Internationalization_Datepicker - Fatal编程技术网

C# WPF DatePicker水印使用了错误的语言,但Dateformat是正确的

C# WPF DatePicker水印使用了错误的语言,但Dateformat是正确的,c#,wpf,internationalization,datepicker,C#,Wpf,Internationalization,Datepicker,我有一个非常奇怪的问题: 在我的机器上,日期选择器根据我要设置的语言/文化更改其水印和日期格式 如果我将应用程序复制到其他计算机,会发生以下情况: 在某些计算机上,它的工作原理与在我的机器上一样。在其他计算机上,只有日期格式更改,但水印不会更改!不用说,有一个日期选择器,比如说,有一个德国日期,但有一个英文水印,这是非常难看的 这种行为的原因是什么? 对于i18n,我使用以下代码: App.xaml.cs: 公共部分类应用程序:应用程序 { 公共应用程序() { CultureInfo ci=新

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

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

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

在某些计算机上,它的工作原理与在我的机器上一样。在其他计算机上,只有日期格式更改,但水印不会更改!不用说,有一个日期选择器,比如说,有一个德国日期,但有一个英文水印,这是非常难看的

这种行为的原因是什么?

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

App.xaml.cs:

公共部分类应用程序:应用程序
{
公共应用程序()
{
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;
                }
            }
        }
    }

}