2009-07-09 34 views
10

Estoy usando el último WPF toolkit, específicamente el DatePicker. Todo funciona bien, pero cuando no se proporciona ningún valor, el texto predeterminado 'SHOW CALENDAR' aparece en DatePickerTextBox. Quiero poder cambiar este valor en WPF.WPF toolkit DatePicker cambiar el valor predeterminado 'show calendar'

Uno me dijo que descargue la fuente, agregue una nueva propiedad de Dependencia y recompile a dll. Eso es genial, pero ¿y si se lanza una nueva versión?

Es por eso que me gustaría crear una plantilla de este control de esa manera, que voy a poder anular esta cadena predeterminada. ¿Alguna idea de cómo hacerlo?

Gracias!

+2

me pareció mejor solución [aquí sobre Matt Hamilton Blog] (http://matthamilton.net/datepicker-watermark). ¡Las obras me forman excelente! – BrightShadow

Respuesta

22

OK. Encontré una solución por mi cuenta.

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

De todas formas, usted tiene que ser consciente del hecho de, que hay una DependencyProperty llama marca de agua que debe ajustarse en lugar del texto.

El problema es que con la última versión MS (alrededor de junio de 2009) hicieron esta propiedad readonly por alguna razón desconocida. Eso significa que este es el único truco que inventé, aunque ocurre una excepción por primera vez, porque el DatePicker está tratando de analizar la cadena (supone que el texto es una fecha), pero normalmente no lo notarás.

Otra posibilidad es editar directamente el código fuente de la MS y la anulación el método SetWaterMark() + añadir su propiedad de dependencia (MyWaterMark o algo así). Pero luego no puede usar el proporcionado dll. Dijeron que vendrá fijo con .NET 4 realese, veamos.

+0

Eso es bueno y todo, pero ¿cómo podemos incorporar esto en un estilo existente que se dirija a Datepicker? –

+0

Esto solo parece funcionar el tiempo de diseño en mi aplicación, tan pronto como inicie, el texto revierte al inglés –

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

tendrá que conectar el evento Load también con el mismo código.

+0

Bueno, tengo que admitir, me gustas tu ejemplo con Reflection ... de todos modos ... necesitas un código detrás de –

+0

Couldn ¿Ponemos esto en una propiedad de dependencia? –

0

esto funciona muy bien, pero también tendrá que anular el método de ejecución en la clase personalizada. En este método, si establece el contenido de la marca de agua y no la propiedad, no hay necesidad de anular el evento OnSelectedDateChanged. de código completo está aquí:

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

También puede hacer esto:

Agregar un cuadro de texto y un selector de fechas para su formulario con los siguientes valores:

En su 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"/> 

Y en sus window.xaml.cs:

private void datePicker_SelectedDateChanged(object sender, SelectionChangedEventArgs e) 
    { 
     textBox.Text = datePicker.SelectedDate.Value.ToString("dd.MM.yyyy"); 
    } 

El resultado es idéntico: klick

Cuestiones relacionadas