WPF toolkit DatePicker cambiare il valore di default ‘mostra il calendario’

Sto usando l’ultima WPF toolkit, in particolare il DatePicker. Tutto funziona bene, ma quando viene specificato alcun valore, il valore di default ‘MOSTRA il CALENDARIO’ testo verrà visualizzato il DatePickerTextBox.
Voglio essere in grado di modificare questo valore in WPF.

Uno mi ha detto di scaricare la fonte, aggiungere una nuova proprietà di Dipendenza e ricompilare la dll. Che figata, ma che cosa, se del rilascio della nuova versione?

Ecco perché mi piacerebbe modello di questo controllo in modo che sarò in grado di sostituire questa stringa di default. Qualsiasi idea di come farlo?

Grazie!

 

4 Replies
  1. 22

    OK. Ho trovato una soluzione da me.

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

    Comunque, è necessario essere consapevoli del fatto, che c’è una Proprietà chiamata Filigrana che deve essere impostata al posto del Testo.

    Il problema è che con le ultime MS rilascio (giugno 2009) hanno fatto questa proprietà readonly per qualche motivo sconosciuto. Che significa, questo è l’unico trucco che ho fatto, anche se non si verifica una Prima eccezione, perché il DatePicker è il tentativo di analizzare la stringa (si presume che il testo da una Data), ma normalmente non si dovrebbe notare.

    Un’altra possibilità è quella di modificare direttamente il codice sorgente di MS e ignorare il SetWaterMark() metodo + aggiungi Proprietà di Dipendenza (MyWaterMark o qualcosa del genere). Ma quindi non è possibile utilizzare il dll. Hanno detto che verrà risolto con l’ .Rete 4 realese, staremo a vedere.

    • Questo è un bene e tutto, ma come possiamo incorporare questo in uno stile esistente che di destinazione Datepicker ???
    • Questo viene visualizzato solo per il lavoro di progettazione nella mia applicazione, non appena mi lancio, il testo torna inglese
  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);
                    }
                }
            }
        }
    

    avrete bisogno di collegare il Carico evento con lo stesso codice.

    • Beh, devo ammettere, mi piace un esempio con la Riflessione.. comunque.. hai bisogno di un codice dietro
    • Non si potrebbe mettere questo in un relative alle dipendenze di proprietà ???
  3. 0

    questa grande opera, ma anche dovrete ignorare onrender metodo in classe personalizzata.
    In questo metodo se si imposta la filigrana del contenuto e non la proprietà non è necessario eseguire l’override OnSelectedDateChanged evento.
    Codice completo è qui:

        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;
                    }
                }
            }
        }
    
  4. 0

    Si potrebbe anche fare questo:

    Aggiungere un controllo textbox e un datepicker per il modulo con le seguenti impostazioni:

    Nella vostra finestra.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"/>
    

    E nella finestra.xaml.cs:

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

    Il risultato assomiglia a questo: klick

Lascia un commento