এক্সএএমএল-তে কীভাবে টাইমস্প্যান ফর্ম্যাট করবেন


92

আমি এমন কোনও পাঠ্যবন্ধকে বিন্যাস করার চেষ্টা করছি যা কোনও TimeSpanসম্পত্তির সাথে আবদ্ধ । সম্পত্তিটি টাইপ করা থাকলে এটি কাজ করে DateTimeতবে এটি ব্যর্থ হলে এটি ব্যর্থ হয় TimeSpan। আমি একটি রূপান্তরকারী ব্যবহার করে এটি সম্পন্ন করতে পারি। তবে এর বিকল্প আছে কিনা তা জানার চেষ্টা করছি।

কোডের উদাহরণ:

public TimeSpan MyTime { get; set; }

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

জ্যামল

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

আমি পাঠ্যরূপটি কেবলমাত্র ঘন্টা এবং মিনিট দেখানোর জন্য প্রত্যাশা করছি। তবে এটি প্রদর্শিত হচ্ছে:

19: 10: 46.8048860


আপনি কি 2010 সালে ফিরে যাওয়ার পথে নেট। এর কোন সংস্করণ মনে করছেন? আমি উইন্ডোজ ফোন XAML সঙ্গে একই সমস্যা হচ্ছে: stackoverflow.com/q/18679365/1001985
McGarnagle

দ্রষ্টব্য: সমস্ত ফর্ম্যাটগুলির শুরুতে {একটি পালাবার ক্রম, কোনও বিন্যাস নির্দিষ্টকরণকারক নয়। এটি এক্সএএমএলকে ব্যাকস্ল্যাশগুলির প্রয়োজন ছাড়াই বিন্যাসে আরও বন্ধনী সহ্য করার কারণ করে।
গ্রেট

উত্তর:


88

.NET 3.5 এ পরিবর্তে আপনি একটি মাল্টিবাইন্ডিং ব্যবহার করতে পারেন

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

আপডেট
মন্তব্যের উত্তর দিতে।

ঘন্টা বা মিনিট 0-9 হয় এমনকি আপনি 2 ডিজিট আউটপুট নিশ্চিত করার জন্য আপনি {0} এর পরিবর্তে {0:00 use ব্যবহার করতে পারেন} এটি নিশ্চিত করবে যে সময়ের জন্য আউটপুট 12: 1 এর পরিবর্তে 12:01 হয়।
আপনি যদি 01:01 1:01 হিসাবে আউটপুট দিতে চানStringFormat="{}{0}:{1:00}"

এবং শর্তযুক্ত বিন্যাসটি কয়েক মিনিটের জন্য নেতিবাচক চিহ্নটি সরাতে ব্যবহার করা যেতে পারে। {1:00 Instead এর পরিবর্তে আমরা {1: 00; 00 use ব্যবহার করতে পারি

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

@ চিবিটি: ধন্যবাদ! আমি ইতিমধ্যে আপনার উত্তরটি জমা দিয়েছি যাতে আমি এটি আর করতে পারি না :) তবে আমি প্রশ্নটির পক্ষে ছিলাম তাই যদি এর প্রয়োজন হয় তবে আমি আপনার সমাধানটিতে ফিরে পেতে পারি! পাশাপাশি খুব সুন্দর
ফ্রেডরিক হেডব্ল্যাড

4
এই আউটপুটটি কি "10: 1" বা "4: 9" হবে না যদি মিনিটের অংশে কেবল একটি অঙ্ক থাকে?
সাইগন

@ সাইগন: এটি কীভাবে ঠিক করতে হয় তার জন্য আমার আপডেট হওয়া উত্তরটি দেখুন। {0} এর পরিবর্তে {0: D2 Use ব্যবহার করুন
ফ্রেডরিক হেডব্ল্যাড

এটি "-07: -12" আউটপুটস 7 ঘন্টা 12 মিনিটের নেতিবাচক টাইমডুয়েশনের জন্য। যদি সময়কাল মাইনাস 7 ঘন্টা হয় তবে আউটপুট "-07: 00" হবে। কিন্তু নেতিবাচক সময়কালে একটি শূন্য-মিনিটের সাথে .Hours.Minutes
সাথেই বিয়োগটি

@ ফ্রেড্রিকহেডব্ল্যাড আমি মিনিট পার্টের TotalMinutesপরিবর্তে প্রদর্শন করতে চাই Minutes(টাইমস্প্যানগুলি দীর্ঘ সময়ের জন্য দেখায় যে 1 ঘন্টা)। তবে TotalMinutesসম্পত্তি দ্বিগুণ ফর্ম্যাটে, সুতরাং <Binding Path="MyTime.TotalMinutes" />উত্পাদিত বৃত্তাকার আউটপুট ব্যবহার করে বাধ্যতামূলক , যা খারাপ - আমার বৃত্তাকার পরিবর্তে কাটা মানটি দেখাতে হবে। ডাবল টু ইন্ট্রুকটিংয়ের জন্য একটি কাস্টম মান কনভার্টার ব্যবহার না করে এটি অর্জন করা সম্ভব?
ডোমিনিক পলো

142

বিন্যাস স্ট্রিং একটি কাজ করার দেয়ার উদ্দেশ্যে করা হচ্ছে DateTime, না একটি TimeSpan

পরিবর্তে আপনি নিজের কোডটি সাথে কাজ করতে পারেন DateTime.Now। আপনার এক্সএএমএল ঠিক আছে:

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

হালনাগাদ

এবং নেট 4 থেকে TimeSpanনিম্নলিখিত হিসাবে ফর্ম্যাট করুন :

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

হ্যাঁ ... তবে আমি এমন কোনও উপায় সন্ধান করছি যাতে আমি টাইমস্প্যান মানটি ফর্ম্যাট করতে পারি।
বিজু

4
আমি তারিখের সংগ্রহ থেকে আমার সময়ের অংশ ফিল্টার করছি, আলাদা করে নিয়েছি, বাছাই করছি..ব্লাহ..আমার যুক্তি যেভাবে চলেছে
বিজু

@ বিজু আমি টাইমস্প্যানের জন্য বিন্যাসের স্ট্রিং সহ নমুনাটি আপডেট করেছি।
টিম লয়েড

4
আমি জানি না যে আমি কিছু ভুল করছি কিনা .. তবে এটি এখনও আমার জন্য এখানে কাজ করছে না Vভিজুয়াল স্টুডিও 2008, ফ্রেমওয়ার্ক 3.5
বিজু

4
এটি সঠিক উত্তর, উপরে বর্ণিত একটি নয়। এমনকি ডট নেট 3.5 এর জন্য প্রস্তাবিত উত্তরের পরিবর্তে একটি রূপান্তরকারী ব্যবহার করুন।
মাইককুলস

45

কেবল পুলটিতে যুক্ত করতে, আমি একটি ডাব্লুপিএফ অ্যাপ্লিকেশনটিতে টাইমস্প্যান প্রদর্শনের জন্য সফলভাবে এই বাঁধাইটি ব্যবহার করছি:

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

ব্যাকস্ল্যাশগুলি সঠিকভাবে পেতে কিছু চেষ্টা করেছে :)


4
আপনি যদি দ্বিতীয়টির ভগ্নাংশে যেতে চান তবে আপনাকে
কমাও

স্ট্রিংফর্ম্যাট = \ {0: এইচএইচ \\: মিমি \\: এসএস \\। এফএফএফ \}
স্টেপান ইভানেনকো

আমার বড় ভুলটি হ'ল আমি ডেটটাইম বিন্যাসের স্ট্রিংয়ের মতো ব্যবহার করেছি। তবে স্পষ্টতই
টাইমস্প্যানের

22

StringFormatএকটি ফর্ম্যাট স্ট্রিং আকারে হতে হবে। এই ক্ষেত্রে এটি দেখতে হবে:

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

দ্রষ্টব্য: আপনি যদি ঘন্টা এবং মিনিটগুলির মোট সংখ্যা প্রদর্শন করতে চান এবং টাইমস্প্যানটি 24 ঘন্টাের বেশি হতে পারে তবে আপনার পদ্ধতির সাথে একটি সতর্কতা রয়েছে: এখানে একটি কার্যকারিতা নেই


@ বিজু - আপডেটড সিনট্যাক্স। স্ট্রিংফর্ম্যাট মানটির চারপাশে একক উদ্ধৃতি অনুপস্থিত ছিল।
পিটার লিলিভল্ড

এবং হ্যাঁ, @ ক্ষুদ্রতার নমুনাটি যেমন দেখায়, এড়াতে একটি দ্বিগুণ \ প্রয়োজন:
পিটার লিলিভল্ড

4
এবং প্রকৃতপক্ষে, এটি কেবল। নেট 4.0 এ কাজ করে! ফর্ম্যাট স্ট্রিং .Net 3.5 এ সম্পূর্ণ উপেক্ষা করা হয়।
পিটার লিলিভল্ড

4
এছাড়াও নোট করুন যে এটি কোনও টেক্সটলক দিয়ে কাজ করে তবে একটি লেবেল দিয়ে নয় (!)।
শ্যাকলস

4
@ শ্যাকলস স্ট্রিংফর্ম্যাটটি কেবল তখনই ব্যবহৃত হবে যখন বাইন্ডিংয়ের টার্গেট স্ট্রিংয়ের একটি সম্পত্তি। Label.Content হ'ল অবজেক্ট, সুতরাং এটি উপেক্ষা করা হবে। টেক্সটব্লক.টেক্সট একটি স্ট্রিং, তাই এটি ব্যবহৃত হয়েছে।
15ee8f99-57ff-4f92-890c-b56153

16

মাল্টি বাইন্ডিংয়ের জন্য আপনাকে নেট নেট 4 থেকে মনোযোগ দিতে হবে।

নীচে একটি সংক্ষিপ্ত বিবরণ, নেট 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}'>

দ্রষ্টব্য: স্ট্রিংফর্ম্যাট = "{} {0: এইচএইচ \: \: মিমি \: এসএস} -> {1: এইচএইচ \: মিমি \: এসএস}" কোনও মাল্টিবাইন্ডিংয়ে কাজ করবে না , এর ফলে ফাঁকা ফলাফল আসবে।


13

আমি জানি যে এই প্রশ্নটি এখন পুরানো, তবে আমি অবাক হয়েছি যে কেউই এই সহজটি প্রস্তাব করেনি StringFormatযা TimeSpanসরাসরি কাজ করবে :

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

4
এই চারদিকে প্রচুর বিভ্রান্তি। মনে হচ্ছে সিন্টেক্সটি নেট নেট 4 দিয়ে পরিবর্তিত হয়েছে
ম্যাকগার্নাগল

12

.NET 4 WPF এখন স্ট্রিং থেকে timespan হয়েছে http://msdn.microsoft.com/en-us/library/ee372286.aspx

আমি নিম্নলিখিত ব্যবহার করছি <TextBlock FontSize="12" Text="{Binding Path=TimeLeft, StringFormat={}{0:g}}" />


4
প্রকৃতপক্ষে .NET 4-4.5 এ কাজ করে। এই থ্রেডে অন্য কোনও সমাধান করে না।
erodewald

2012 সালের ফেব্রুয়ারিতে এটি সত্য ছিল, তবে এটি আর নয়।
শেরিডান

10

আপনি যদি একটি ট্যাগ StringFormat ব্যবহার করতে যে ব্যবহারসমূহ বিষয়বস্তু সম্পত্তি, আপনি ব্যবহার করতে পারেন চান ContentStringFormat আপনার timespan ফরম্যাট করতে:

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

4
আপনার উত্তরে আপনি যা বলেছেন তা দ্বিগুণ হাইলাইটিংয়ের দাবিদার: এক্সএএমএল নিয়ন্ত্রণ করে যে Contentসম্পত্তি ব্যবহার করে (যেমন, Textসম্পত্তি হিসাবে নয়, উদাহরণস্বরূপ, ক TextBlock), সম্পত্তি ContentStringFormat অবশ্যই ব্যবহার করা উচিতStringFormatবাইন্ডিংয়ের অংশ হিসাবে নির্দিষ্ট করা কার্যকর হবে না।
অবগত তথ্য

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.