2009-07-09 11 views
10

私は最新のWPFツールキット、特にDatePickerを使用しています。すべて正常に動作しますが、値が指定されていない場合、デフォルトの 'SHOW CALENDAR'テキストがDatePickerTextBoxに表示されます。 WPFでこの値を変更できるようにします。WPFツールキットDatePickerのデフォルト値を変更する 'show calendar'

ソースをダウンロードし、新しい依存関係プロパティを追加し、dllに再コンパイルするように指示されました。それは素晴らしいですが、新しいバージョンがリリースされたらどうなりますか?

このように、このコントロールをテンプレートにして、このデフォルトの文字列をオーバーライドできるようにしたいのです。どのようにそれを行うにはどのようなアイデア?

ありがとうございます!

+2

私はより良い解決策を見つけました。[Matt Hamilton Blog on here](http://matthamilton.net/datepicker-watermark)作品は素晴らしい私を形成! – BrightShadow

答えて

22

OK。私は自分で解決策を見つけました。とにかく

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

あなたがたDependencyPropertyは、テキストの代わりに設定されるべきであるウォーターマークと呼ばれるがあることを、事実を意識する必要があります。

問題は、最新のMSリリース(2009年6月頃)では、何らかの理由でこのプロパティを読み取り専用にしたという問題です。これは、私が作成した唯一のハックですが、DatePickerは文字列を解析しようとしているので(最初の例外が発生します)、通常は気づかないでしょう。

また、ソースコードをMSから直接編集し、SetWaterMark()メソッド+独自の依存プロパティ(MyWaterMarkなど)を追加することもできます。しかし、あなたは提供されたdllを使用することはできません。彼らはを.NET 4のrealeseで修正する予定だと、見てみましょう。

+0

これはいいですし、すべてですが、これをDatepickerをターゲットとする既存のスタイルにどのように組み込むことができますか? –

+0

これは私のアプリケーションで設計時間を稼働するように見えるだけです。起動するとテキストは英語に戻ります –

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); 
       } 
      } 
     } 
    } 

同じイベントコードを同じコードに追加する必要があります。

+0

私はあなたにリフレクションの例が好きです。とにかく後ろにコードが必要です –

+0

Couldn私たちはこれを依存関係のプロパティに入れませんか? –

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

関連する問題