WPF toolkit DatePicker cambiar el valor predeterminado «mostrar calendario’

Estoy usando la última WPF toolkit, específicamente el DatePicker. Todo funciona bien, pero cuando no se proporciona ningún valor, el valor predeterminado » MOSTRAR en el CALENDARIO de texto aparece en la DatePickerTextBox.
Quiero ser capaz de cambiar este valor en WPF.

Uno me dijo para descargar el código fuente, agregar una nueva propiedad de Dependencia y volver a compilar dll. Que está muy bien, pero ¿y si la nueva versión es liberada?

Es por eso que me gustaría plantilla de este control de esa manera, que voy a ser capaz de invalidar este valor de cadena. Alguna idea de cómo hacer eso?

Gracias!

He encontrado una mejor solución aquí en Matt Hamilton Blog. Obras de mí, ¡excelente!

OriginalEl autor PaN1C_Showt1Me | 2009-07-09

4 Kommentare

  1. 22

    ACEPTAR. He encontrado una solución por mí mismo.

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

    De todos modos, usted tiene que ser consciente del hecho de, que no es un DependencyProperty llamado marca de agua que se debe establecer en el lugar del Texto.

    El problema es que con la última MS de liberación (junio de 2009) se hizo de esta propiedad readonly por alguna razón desconocida. Que significa, que este es el único hack yo, aunque no se produce por Primera vez la excepción, ya que el selector de fecha se está tratando de analizar la cadena (él supone que el texto a ser una Fecha), pero normalmente no se notan.

    Otra posibilidad es editar directamente el código fuente de MS y reemplazar la SetWaterMark() método + añadir su propia Propiedad de Dependencia (MyWaterMark o algo). Pero entonces usted no puede utilizar el dll. Dijeron que vendrá fijo con el .NET 4 realese, vamos a ver.

    Eso es bueno y todo, pero ¿cómo podemos incorporar esto en un estilo existente que se dirigen a Datepicker ???
    Esta opción sólo aparece para el trabajo de diseño de tiempo en mi aplicación, tan pronto como me lanzamiento, el texto vuelve a la versión en inglés

    OriginalEl autor PaN1C_Showt1Me

  2. 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ás que conectar el evento de Carga, así como con el mismo código.

    Bueno, tengo que admitir, me gusta el ejemplo con la Reflexión.. de todos modos.. necesitas un código que está detrás de
    No podríamos poner esto en una dependencia de la propiedad ???

    OriginalEl autor cp.net

  3. 0

    esto funciona muy bien, pero también tendrás que reemplazar onrender método en la clase personalizada.
    En este método, si se establece la marca de agua contenido y no de la propiedad, no hay necesidad de reemplazar OnSelectedDateChanged evento.
    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;
                    }
                }
            }
        }
    

    OriginalEl autor Mario Rancic

  4. 0

    También se podría hacer esto:

    Agregar un cuadro de texto y un selector de fecha para el formulario con la siguiente configuración:

    En su ventana.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 tu ventana.xaml.cs:

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

    El resultado se parece a esto: klick

    OriginalEl autor D. Amsberg

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea