This article has been localized into Persian by the community.
کنترل TextBlock
از آنجایی که تکست بلاک(TextBlock) از کلاس کنترل(Control) ارث بری نمی کند، به خودی خود یک کنترل محصوب نمی شود اما در واقع مثل هر کنترل دیگری در فریم ورک WPF از آن استفاده می شود و ما نیز برای ساده کردن موضوع، به آن کنترل می گوییم.
کنترل TextBlock یکی از اساسی ترین کنترل ها در WPF و در عین حال کنترلی بسیار مفید است که مانند کنترل Label و البته به روشی ساده تر و با مصرف کمترین منابع، به شما امکان می دهد متنی را بر روی صفحه نمایش دهید. بصورت کلی Label، برای متون کوتاه و یک خطی(که ممکن است شامل مثلا یک تصویر یا غیره نیز باشد) اما TextBlock برای هم متون یک خطی و هم چند خطی استفاده می شود و تنها می تواند متن(string) را نمایش دهد. بهر حال هر دوی این ها (Label و TextBlock) مزایای خاص خود را دارند و انتخاب شما می تواند بسته به شرایط تغییر کند.
ما پیش از این از تکست بلاک در مقاله ی "Hello, WPF!" استفاده کرده بودیم، اما هم اکنون بیاید به ساده ترین شکل آن در داخل یک فرم نگاهی بیاندازیم :
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSample" Height="100" Width="200">
<Grid>
<TextBlock>This is a TextBlock</TextBlock>
</Grid>
</Window>
به همین سادگیِ که دارید می بینید و اگر قسمت های قبلی این آموزش رو خوندید، پس هیچ چیز جدیدی اینجا نیست.متن نوشته شده بین TextBlock یک میان بر ساده برای تنظیم ویژگی متن(Text) در TextBlock است.
برای مثال بعدی ، اجازه بدید یک متن بلند تر را امتحان کنیم، تا ببینیم TextBlock چه جوری باهاش برخورد می کنه. همچنین من یه مقدار حاشیه خارجی (Margin - لبه) بهش اضافه کردم، که یکم بهتر به نظر بیاد :
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSample" Height="100" Width="200">
<Grid>
<TextBlock Margin="10">This is a TextBlock control and it comes with a very long text</TextBlock>
</Grid>
</Window>
برخورد با رشته های طولانی
همونطور که به زودی از اسکرین شات میفهمید، TextBlock به عالی ترین شکل ممکن توانایی برخورد با متن های بلند و چند خطی رو داره ، اما هیچ کاری رو به صورت پیشفرض انجام نمیده. در این مورد متن بلند تر از اونه که داخل فرم پنجره (Window) رندر بشه، پس WPF تا جایی که جا داره رندرش می کنه و نه بیشتر.
خوشبختانه ، اینجا راه های زیادی برای برخورد با این قضیه وجود داره. در مثال بعدی همه اونها رو به شما نشان می دهم ، و بعد هر کدوم رو به شما توضیح میدم:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSample" Height="200" Width="250">
<StackPanel>
<TextBlock Margin="10" Foreground="Red">
This is a TextBlock control<LineBreak />
with multiple lines of text.
</TextBlock>
<TextBlock Margin="10" TextTrimming="CharacterEllipsis" Foreground="Green">
This is a TextBlock control with text that may not be rendered completely, which will be indicated with an ellipsis.
</TextBlock>
<TextBlock Margin="10" TextWrapping="Wrap" Foreground="Blue">
This is a TextBlock control with automatically wrapped text, using the TextWrapping property.
</TextBlock>
</StackPanel>
</Window>
خب، ما سه عدد کنترل TextBlock داریم ،برای هرکدوم یک رنگ متفاوت انتخاب کردیم(از ویژگی پیش زمینه(Foreground )استفاده کردیم) تا بشه راحت تر بررسیشون کرد.تمام اونها یک وجه اشتراک دارن و اون هم اینه که محتوای متنی آنها به شیوه های مختلفی طولانی هستند.
قرمز TextBlock از تگ LineBreak برای شکستن دستی خط در زمان طراحی استفاده می کند. اینکار به شما توانایی شکستن خط در نقطه دلخواهتون و رفتن به خط جدید رو میده ، اما تو بیشتر موارد خیلی انعطاف پذیر نیست.اگر کاربر فرم پنجره رو بزرگتر کنه ، متن همچنان در همون نقطه قطع شده مانده ، حتی اگر فضای خالی برای قرارگیری کل من در یک خط هم وجود داشته باشه.
در تکست بلاک سبز رنگ از خاصیت TextTrimming استفاده شده است که می تواند با استفاده از مقدار CharacterEllipsis زمانیکه نمی تواند متن های بیشتر در این کنترل را نمایش دهد، ادامه متن این تکست بلاک را بصورت نقطه نقطه نمایش میدهد (...) (بخاطر محدودیت در فضای کاراکترها). این یک روش رایج در تکست بلاک برای نمایش متون طولانی می باشد که فضای کافی برای نمایش را ندارد. این زمانی مناسب است که شما یه متن طولانی دارید و نمی خواهید بیشتر از یک خط استفاده کنید. بعنوان جایگزین CharacterEllipsis شما ممکن است از WordEllipsis استفاده کنید که فضای بعد از آخرین کلمه ممکن را بجای آخرین کارارکتر ممکن در آخر خط می شکند (با توجه به فضای موجود در آخر خط) و به خط بعدی منتقل می کند.
TextBlock آبیاز ویژگی TextWrapping با مقدار Wrap استفاده می کنه، برای آنکادر کردن خطوط یک TextBlock تا جایی که نتونه متن رو در یک خط جا بده به خط بعدی میره. برخلاف TextBlock اول که خودمون می گفتیم متن کجا بریده بشه ،اینجا به صورت کاملا خودکار اتفاق می افته و حتی بهتر : حتی به صورت خودکار بر اساس فضای موجود در TextBlock تنظیم میشه. سعی کنید فرم پنجره موجود در مثال رو بزرگ و کوچیک کنید و می بینید که چطور خطوط خودشون رو بر اساس موقعیت تطبیق میدن.
تمام چیزی که در برخورد با رشته های ساده در TextBlock هست همین بود. در قسمت بعدی ما به عملکرد های حرفه ای تر TextBlock نگاهی میندازیم ، همان هایی که به شما اجازه تولید سبک های مختلف TextBlock و خیلی چیز های دیگه رو میده.