2010-09-29 18 views
31

के स्ट्रिंग प्रारूप को बदलना मुझे अलग-अलग हिस्सों के लिए स्लेश के बजाय हाइफ़न का उपयोग करने के लिए WPF Toolkit DatePicker में DatePickerTextBox के स्ट्रिंग प्रारूप को बदलने की आवश्यकता है।WPF DatePicker

क्या इस डिफ़ॉल्ट संस्कृति या प्रदर्शन स्ट्रिंग प्रारूप को ओवरराइड करने का कोई तरीका है?

01-01-2010 

उत्तर

76

मैं इस कोड की मदद से इस समस्या का समाधान कर दिया है:

मैं अपने दृश्य के निर्माता जो मौजूदा थ्रेड के लिए ShortDateFormat ओवरराइड करता है में निम्न कोड डाल दिया है। उम्मीद है कि यह आपको भी मदद करेगा।

<Style TargetType="{x:Type DatePickerTextBox}"> 
<Setter Property="Control.Template"> 
    <Setter.Value> 
    <ControlTemplate> 
    <TextBox x:Name="PART_TextBox" 
    Text="{Binding Path=SelectedDate, StringFormat='dd MMM yyyy', 
    RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" /> 
    </ControlTemplate> 
    </Setter.Value> 
</Setter> 
</Style> 
+0

thx, इससे मुझे केवल महीने चुनने के लिए दिनांक पिकर का उपयोग करने में पूरी तरह हल करने में मदद मिली। मैंने http://stackoverflow.com/questions/1798513/wpf-toolkit-datepicker-month-year-only/14902905#14902905 में अपना xaml उद्धृत किया। – GameAlchemist

+2

इस विधि के विशाल प्रशंसक। मैं संस्कृति को बदलने पर ऐसा करना पसंद करता हूं। – Dom

+0

यह सच जवाब है! वर्तमान में, गंदे हैक को उत्तर के रूप में चिह्नित किया गया है। अफ़सोस की बात है। – dzendras

5

दुर्भाग्यवश, अगर आप XAML के बारे में बात कर रहे हैं, तो आप SelectedDateFormat स्थापित करने के साथ फंस रहे हैं करने के लिए "लंबे समय" या "कम"।

यदि आपने टूलकिट के स्रोत को बाइनरी के साथ डाउनलोड किया है, तो आप देख सकते हैं कि यह कैसे परिभाषित किया गया है।

DatePicker.cs

#region SelectedDateFormat 

/// <summary> 
/// Gets or sets the format that is used to display the selected date. 
/// </summary> 
public DatePickerFormat SelectedDateFormat 
{ 
    get { return (DatePickerFormat)GetValue(SelectedDateFormatProperty); } 
    set { SetValue(SelectedDateFormatProperty, value); } 
} 

/// <summary> 
/// Identifies the SelectedDateFormat dependency property. 
/// </summary> 
public static readonly DependencyProperty SelectedDateFormatProperty = 
    DependencyProperty.Register(
    "SelectedDateFormat", 
    typeof(DatePickerFormat), 
    typeof(DatePicker), 
    new FrameworkPropertyMetadata(OnSelectedDateFormatChanged), 
    IsValidSelectedDateFormat); 

/// <summary> 
/// SelectedDateFormatProperty property changed handler. 
/// </summary> 
/// <param name="d">DatePicker that changed its SelectedDateFormat.</param> 
/// <param name="e">DependencyPropertyChangedEventArgs.</param> 
private static void OnSelectedDateFormatChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    DatePicker dp = d as DatePicker; 
    Debug.Assert(dp != null); 

    if (dp._textBox != null) 
    { 
     // Update DatePickerTextBox.Text 
     if (string.IsNullOrEmpty(dp._textBox.Text)) 
     { 
      dp.SetWaterMarkText(); 
     } 
     else 
     { 
      DateTime? date = dp.ParseText(dp._textBox.Text); 

      if (date != null) 
      { 
       dp.SetTextInternal(dp.DateTimeToString((DateTime)date)); 
      } 
     } 
    } 
} 



#endregion SelectedDateFormat 

private static bool IsValidSelectedDateFormat(object value) 
{ 
    DatePickerFormat format = (DatePickerFormat)value; 

    return format == DatePickerFormat.Long 
     || format == DatePickerFormat.Short; 
} 

private string DateTimeToString(DateTime d) 
{ 
    DateTimeFormatInfo dtfi = DateTimeHelper.GetCurrentDateFormat(); 

    switch (this.SelectedDateFormat) 
    { 
     case DatePickerFormat.Short: 
      { 
       return string.Format(CultureInfo.CurrentCulture, d.ToString(dtfi.ShortDatePattern, dtfi)); 
      } 

     case DatePickerFormat.Long: 
      { 
       return string.Format(CultureInfo.CurrentCulture, d.ToString(dtfi.LongDatePattern, dtfi)); 
      } 
    }  

    return null; 
} 

DatePickerFormat.cs

public enum DatePickerFormat 
{ 
    /// <summary> 
    /// Specifies that the date should be displayed 
    /// using unabbreviated days of the week and month names. 
    /// </summary> 
    Long = 0, 

    /// <summary> 
    /// Specifies that the date should be displayed 
    ///using abbreviated days of the week and month names. 
    /// </summary> 
    Short = 1 
} 
20

यह Wonko के जवाब के अनुसार, प्रकट होता है, आपके द्वारा निर्दिष्ट नहीं कर सकते: यहाँ है कि कोड के मुख्य आकर्षण में से कुछ हैं Xaml प्रारूप में दिनांक प्रारूप या DatePicker से विरासत में।

CultureInfo ci = CultureInfo.CreateSpecificCulture(CultureInfo.CurrentCulture.Name); 
ci.DateTimeFormat.ShortDatePattern = "dd-MM-yyyy"; 
Thread.CurrentThread.CurrentCulture = ci; 
9

WPF टूलकिट DateTimePicker अब एक Format संपत्ति और एक FormatString संपत्ति है। यदि आप प्रारूप प्रकार के रूप में Custom निर्दिष्ट करते हैं, तो आप अपनी खुद की प्रारूप स्ट्रिंग प्रदान कर सकते हैं।

<wpftk:DateTimePicker 
    Value="{Binding Path=StartTime, Mode=TwoWay}" 
    Format="Custom" 
    FormatString="MM/dd/yyyy hh:mmtt"/> 
1

कनवर्टर वर्ग:

public class DateFormat : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null) return null; 
     return ((DateTime)value).ToString("dd-MMM-yyyy"); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

WPF टैग

<DatePicker Grid.Column="3" SelectedDate="{Binding DateProperty, Converter={StaticResource DateFormat}}" Margin="5"/> 

आशा है कि यह मदद करता है

0

स्वरूप स्थिति के अनुसार प्रदर्शन किया लेकिन यह इस लेखन से बचा जा सकता:

! 10

और तुम खुश हो जाएगा (दिन - 'एम एम' - 'yyy)

9

स्वीकार किए जाते हैं जवाब (धन्यवाद @petrycol) मेरे सही रास्ते पर डाल दिया है, लेकिन मैं एक और पाठ बॉक्स सीमा और पृष्ठभूमि रंग रही थी वास्तविक तिथि पिकर के भीतर। निम्नलिखित कोड का उपयोग करके इसे फिक्स्ड करें।

 <Style TargetType="{x:Type Control}" x:Key="DatePickerTextBoxStyle"> 
      <Setter Property="BorderThickness" Value="0"/> 
      <Setter Property="VerticalAlignment" Value="Center"/> 
      <Setter Property="Background" Value="{x:Null}"/> 
     </Style> 

     <Style TargetType="{x:Type DatePickerTextBox}" > 
      <Setter Property="Control.Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <TextBox x:Name="PART_TextBox" 
          Text="{Binding Path=SelectedDate, StringFormat='dd-MMM-yyyy', RelativeSource={RelativeSource AncestorType={x:Type DatePicker}}}" Style="{StaticResource DatePickerTextBoxStyle}" > 
         </TextBox> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
+0

बिल्कुल सही! एक जादू की तरह काम किया :-) – MaYaN

1

XAML

<DatePicker x:Name="datePicker" /> 

सी #

var date = Convert.ToDateTime(datePicker.Text).ToString("yyyy/MM/dd"); 

डाल कभी स्वरूप क्या आप ToString ("") (दिन MMM yyy ") और उत्पादन प्रारूप उदाहरण ToString के लिए" में चाहते हो जाएगा 7 जून 2017