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

1つ言えることはWatermarkDatePicker実装されたバギーでは、簡単にアクセスすることはできません. おそらく、この難しさのために、テキストのローカライズは機能しません。のすばらしい記事があります。ここ@Matt Hamiltonから引用します。

ただし、多くの人 (私自身を含む) が DatePicker について気に入らない点は、デフォルトで日付が表示されない場合、「日付を選択してください」というテキストが透かしとして表示され、このテキストがコントロールに焼き付けられることです。 - ローカライズされていないか、パブリック プロパティからアクセスできません。問題の日付がオプションであり、必ずしもユーザーに日付を選択するよう求めたくない場合、これは特にイライラします。

同じ記事で、彼は へのアクセス方法の決定を提供しますWatermark。ここ:

WPF 4.0 DatePicker コントロールをローカライズする方法

@Wayne Maurer添付された依存関係プロパティの形式でユニバーサル ソリューションを作成しました。

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

上記の例を使用して、現在の文化に基づいて、透かしのテキストを設定する必要があります。

Note:Silverlight で作成さWatermarkDatePickerたアクセス [ 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 イベントをオーバーライドすることです。透かしプロパティを設定し、透かしコンテンツを設定しない場合は、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 に答える