XAML में TimeSpan को फॉर्मेट कैसे करें


92

मैं एक टेक्स्टब्लॉक को प्रारूपित करने की कोशिश कर रहा हूं जो एक TimeSpanसंपत्ति के लिए बाध्य है । यह काम करता है अगर संपत्ति प्रकार की है, DateTimeलेकिन यह विफल रहता है अगर यह एक हैTimeSpan । मैं इसे एक कनवर्टर का उपयोग करके प्राप्त कर सकता हूं। लेकिन मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या कोई विकल्प है।

नमूना कोड:

public TimeSpan MyTime { get; set; }

public Window2()
{
    InitializeComponent();
    MyTime = DateTime.Now.TimeOfDay;
    DataContext = this;
}

Xaml

<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>

मैं केवल घंटों और मिनट दिखाने के लिए टेक्स्टब्लॉक की उम्मीद कर रहा हूं। लेकिन यह इस प्रकार है:

19: 10: ४६.८०,४८,८६०


क्या आपको याद है कि .Net का कौन सा संस्करण आप 2010 में वापस आ रहे थे? मुझे Windows Phone XAML के साथ एक समान समस्या है: stackoverflow.com/q/18679365/1001985
McGarnagle

नोट: सभी स्वरूपों की शुरुआत में {} एक एस्केप सीक्वेंस है, न कि कोई प्रारूप निर्दिष्ट करने वाला। यह XAML को बैकस्लैम की आवश्यकता के बिना प्रारूप में और कोष्ठक को सहन करने का कारण बनता है।
२०:१४

जवाबों:


88

.NET 3.5 में आप इसके बजाय मल्टीबाइंडिंग का उपयोग कर सकते हैं

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0}:{1}">
            <Binding Path="MyTime.Hours"/>
            <Binding Path="MyTime.Minutes"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

अपडेट
टिप्पणियों का जवाब देने के लिए।

यह सुनिश्चित करने के लिए कि आप 2 अंकों का उत्पादन करते हैं भले ही घंटे या मिनट 0-9 हो, आप {0} के बजाय {0:00} का उपयोग कर सकते हैं। यह सुनिश्चित करेगा कि 12: 1 के बजाय 12:01 के समय का आउटपुट होगा।
यदि आप 01:01 का उपयोग 1:01 के रूप में करना चाहते हैंStringFormat="{}{0}:{1:00}"

और सशर्त स्वरूपण का उपयोग मिनटों के लिए नकारात्मक संकेत को हटाने के लिए किया जा सकता है। {1:00} के बजाय हम {1: 00; 00} का उपयोग कर सकते हैं

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0:00}:{1:00;00}">
            <Binding Path="MyTime.Hours" />
            <Binding Path="MyTime.Minutes" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

@chibacity: धन्यवाद! मैंने पहले से ही आपके उत्तर का श्रेय दिया है इसलिए मैं इसे फिर से नहीं कर सकता हूं :) लेकिन मैंने प्रश्न का समर्थन किया ताकि मुझे आपके समाधान पर वापस मिल सके अगर मुझे कभी इसकी आवश्यकता थी! साथ ही बहुत अच्छा है
फ्रेड्रिक हेडब्लैड

1
क्या यह आउटपुट "10: 1" या "4: 9" नहीं होगा यदि मिनट के हिस्से में केवल एक अंक है?
साइगॉन

@Cygon: इसे कैसे ठीक किया जाए, इसके लिए मेरा अद्यतन उत्तर देखें। {0} के बजाय {0: D2} का उपयोग करें
फ्रेड्रिक हेडब्लैड

यह 7 घंटे और 12 मिनट के नकारात्मक समय के लिए "-07: -12" आउटपुट करता है। यदि अवधि शून्य से 7 घंटे है, तो आउटपुट "-07: 00" होगा। लेकिन जैसे ही एक नकारात्मक समय पर एक शून्य-शून्य मिनट के साथ, शून्य से जोड़ा जाता है और .Hoursसाथ ही.Minutes
tzippy

@FredrikHedblad मैं मिनट के भाग के TotalMinutesबजाय दिखाना चाहता हूं (टाइमपास को Minutesसबसे लंबा दिखाने के लिए कि 1 घंटा)। लेकिन TotalMinutesसंपत्ति दोहरे प्रारूप में है, इसलिए <Binding Path="MyTime.TotalMinutes" />गोल उत्पादन का उपयोग करके बाध्यकारी है , जो खराब है - मुझे गोल के बजाय छंटनी मूल्य दिखाने की आवश्यकता है। कस्टम से डबल करने के लिए कस्टम मूल्य उत्तोलक का उपयोग किए बिना इसे प्राप्त करना संभव है?
डोमिनिक पालो

140

प्रारूप स्ट्रिंग एक पर काम करने का इरादा है DateTime, न कि एक TimeSpan

आप DateTime.Nowइसके बजाय काम करने के लिए अपना कोड बदल सकते हैं । आपका xaml ठीक है:

<TextBlock Text="{Binding MyTime,StringFormat=HH:mm}"/>

अपडेट करें

और .Net 4 प्रारूप TimeSpanसे निम्नानुसार है:

<TextBlock Text="{Binding MyTime,StringFormat=hh\\:mm}"/>

हां ... लेकिन मैं कुछ ऐसा तरीका ढूंढ रहा हूं जिससे मैं एक Timespan मान को प्रारूपित कर सकूं।
बिजु

1
मैं अपना समय भाग तारीखों के संग्रह से फ़िल्टर कर रहा हूं, अलग-अलग, छाँटकर..ब्लॉ..जिस तरह से मेरा तर्क जाता है
biju

@biju मैंने TimeSpan के लिए एक प्रारूप स्ट्रिंग के साथ नमूना अद्यतन किया है।
टिम लॉयड

2
मुझे नहीं पता कि मैं कुछ गलत कर रहा हूँ..लेकिन यह अभी भी मेरे लिए यहाँ काम नहीं कर रहा है। विजुअलस्टैडियो 2008, फ्रेमवर्क 3.5
बीजू

1
यह सही उत्तर है, न कि ऊपर चिह्नित किया गया। यहां तक ​​कि डॉट नेट 3.5 के लिए सुझाए गए उत्तर के बजाय एक कनवर्टर का उपयोग करें।
मिकुल्ल्स

45

बस पूल में जोड़ने के लिए, मैं इस बंधन का उपयोग उत्पादन WPF ऐप में टाइमस्पैन प्रदर्शित करने के लिए सफलतापूर्वक कर रहा हूं:

Binding="{Binding Time, Mode=TwoWay, StringFormat=\{0:h\\:mm\}}"

कुछ backslashes सही पाने की कोशिश करता है :)


5
क्या आप दूसरे के अंशों में जाना चाहते हैं, तो आपको अल्पविराम से भी बचना होगा: {0: hh \\: mm \\: ss \\।
Ffff

StringFormat = \ {0: hh \\: मिमी \\: ss \\ FFF \।}
Stepan Ivanenko

हर समय मेरी बड़ी गलती यह थी कि मैंने एच का इस्तेमाल किया जैसे डेटाइम प्रारूप स्ट्रिंग। लेकिन स्पष्ट रूप से
टाइमस्पैन के

22

StringFormatएक प्रारूप स्ट्रिंग के रूप में होना चाहिए। इस मामले में ऐसा लगेगा:

<TextBlock Text="{Binding MyTime,StringFormat=`Time values are {0:hh\\:mm}`}"/>

नोट: यदि आप कुल घंटों और मिनटों को प्रदर्शित करना चाहते हैं और 24 घंटे से अधिक समय तक होता है, तो आपके दृष्टिकोण के साथ एक चेतावनी है: यहां एक समाधान है


@biju - सिंटैक्स अपडेट किया गया। StringFormat मान के आसपास एकल उद्धरण गायब था।
पीटर लिलवॉल्ड

और हाँ, जैसा कि @chibacity नमूना दिखाता है, उससे बचने के लिए एक डबल \ _ की आवश्यकता होती है:
पीटर लिलेवॉल्ड

1
और वास्तव में, यह केवल .Net 4.0 में काम करता है! प्रारूप स्ट्रिंग को .Net 3.5 में पूरी तरह से अनदेखा किया गया है।
पीटर लिलवॉल्ड

2
यह भी ध्यान दें कि यह एक TextBlock के साथ काम करता है लेकिन लेबल के साथ नहीं (!)।
बंधन

2
@ शेकल्स स्ट्रिंगफॉरमेट का उपयोग केवल तभी किया जाता है जब बाइंडिंग का लक्ष्य स्ट्रिंग का एक गुण है। Label.Content Object है, इसलिए इसे नजरअंदाज किया जाता है। TextBlock.Text एक स्ट्रिंग है, इसलिए इसका उपयोग किया जाता है।
15ee8f99-57ff-4f92-890c-b56153

16

.NET 4 के बाद से मल्टी बाइंडिंग के लिए आपको ध्यान देने की आवश्यकता है।

नीचे संक्षिप्त अवलोकन, .NET 4.6 के साथ परीक्षण किया गया:

नियमित बाध्यकारी:

<TextBlock Text="{Binding Start, StringFormat='{}{0:hh\\:mm\\:ss}'}" />

बहु बंधन:

<TextBlock.Text>
    <MultiBinding StringFormat="{}{0:hh':'mm':'ss} -> {1:hh':'mm':'ss}">
        <Binding Path="Start" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
        <Binding Path="End" Mode="OneWay" UpdateSourceTrigger="PropertyChanged" />
    </MultiBinding>
</TextBlock.Text>

या आप उपयोग कर सकते हैं " के बजाय ' multibinding में:

<MultiBinding StringFormat='{}{0:hh":"mm":"ss} -> {1:hh":"mm":"ss}'>

नोट: StringFormat = "{} {0: hh \: \: mm \: ss} -> {1: hh \: mm \: ss}" का उपयोग करने से कोई मल्टीबाइंडिंग नहीं चलेगी, इससे रिक्त परिणाम आएगा।


13

मुझे पता है कि यह प्रश्न अब पुराना है, लेकिन मुझे आश्चर्य है कि किसी ने भी इस सरल का सुझाव नहीं दिया StringFormatजो TimeSpanसीधे काम करेगा :

<TextBlock Text="{Binding MyTime, StringFormat={}{0:hh}:{0:mm}, FallbackValue=00:00}"/>

2
इसको लेकर काफी भ्रम की स्थिति है। ऐसा लगता है कि शायद वाक्यविन्यास .NET 4 के साथ बदल गया है
McGarnagle

12

.NET 4 में WPF के पास अब स्ट्रिंग्स http://msdn.microsoft.com/en-us/library/ee372286.aspx से टाइमपेन है

मैं निम्नलिखित का उपयोग कर रहा हूँ <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />


1
वास्तव में .NET 4-4.5 में काम करता है। इस धागे में कोई अन्य समाधान नहीं है।
एरोडेवाल्ड

शायद फरवरी 2012 में यह सच था, लेकिन अब ऐसा नहीं है।
शेरिदन

8

यदि आप एक लेबल में StringFormat उपयोग करने के लिए है कि का उपयोग करता है सामग्री संपत्ति है, तो आप उपयोग कर सकते हैं चाहते हैं ContentStringFormat अपने समयावधि फ़ॉर्मेट करने के लिए:

<Label Content={Binding MyTimespan}" ContentStringFormat="{}{0:hh}:{0:mm}:{0:ss}"

आप अपने उत्तर में क्या कहते हैं, एक दोहरी हाइलाइटिंग के हकदार हैं: एक्सएएमएल नियंत्रण में है कि Contentसंपत्ति का उपयोग करें (जैसे, Textसंपत्ति नहीं , उदाहरण के लिए, ए TextBlock), संपत्ति का उपयोग किया ContentStringFormat जाना चाहिए। StringFormatबाध्यकारी के भाग के रूप में निर्दिष्ट करने से काम नहीं चलेगा।
अनौपचारिक

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.