This article has been localized into Persian by the community.
کنترل TextBlock - قالب بندی درجا
در این مقاله به بررسی عملکرد اصلی کنترل TextBlock پرداخته ایم: نمایش یک متن ساده و در بر گرفتن کل متن در صورت لزوم. ما حتی رنگی غیر از رنگ پیش فرض را برای نمایش متن استفاده کرده ایم، اما چه کنیم اگر بخواهیم بیشتر از یک رنگ ثابت برای تمام متن داخل TextBlock تعیین کنیم؟
خوشبختانه کنترل TextBlock از عناصر در متنی پشتیبانی می کند. این سازه های کنترل-مانند همگی از کلاس در متن ارث بری می کنند، بدین معنی که می توان از آنها به صورت در متن و به صورت قسمتی از یک متن بزرگتر استفاده کرد. همانگونه که می نویسیم، این عناصر پشتیبانی شده شامل این موارد می شود: بلوک لنگر، خط ضخیم، لینک پیوند، InlineUIContainer، خط کج، جدا ساز خط، اجرا کننده، گستره و زیر خط.
بولد (برجسته)، ایتالیک (کج)، خط زیر متن
اینها احتمالا ساده ترین نوع المان های خطی هستند. اسمشون همه چیز رو راجع به کاربردشان بیان می کند ، اما ما همچنان یه مثال سریع برای چگونگی استفاده از آن ها را در اختیار شما قرار میدیم:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockInlineSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockInlineSample" Height="100" Width="300">
<Grid>
<TextBlock Margin="10" TextWrapping="Wrap">
TextBlock with <Bold>bold</Bold>, <Italic>italic</Italic> and <Underline>underlined</Underline> text.
</TextBlock>
</Grid>
</Window>
دقیقا مثل HTML ، شما فقط کافیه متن مورد نظرتون رو بین تگ Bold قرار بدید تا متن موردن نظرتون ضخیم بشه. به همین راحتی امکان تولید متن های متنوع رو برنامه هاتون دارید.
هر سه این تگ ها فرزند کلاس Span هستند ، برای ساخت افکت دلخواه هر کدام یک ویژگی رو در Span تنظیم می کنند. برای نمونه ، تگ Bold فقط ویژگی ضخامت قلم (font) در المان Span روشن میکند، Italic سبک فونت را و الی آخر.
جداساز خط
به سادگی یک جدا ساز خط را به متن اضافه کنید. لطفاً برای مشاهده ی مثالی که در آن ما جدا ساز خط را استفاده کرده ایم، به فصل قبل مراجعه کنید.
لینک پیوند
المان Hyperlink اجازه میده تا یک لینک را در متن خود داشته باشید. این المان با سبک (Theme) جاری فرم ویندوز شما رندر میشه ، که معمولا شامل متن آبی زیر خط دار که وقتی ماوس روش قرار میگیره به شکل دست در میاد و رنگ متن قرمز میشه ، هست. شما می توانید با استفاده از خصوصیت NavigateUri آدرسی که می خواهید به آن هدایت شوید را تعریف کنید. این هم یک مثال:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockHyperlinkSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockHyperlinkSample" Height="100" Width="300">
<Grid>
<TextBlock Margin="10" TextWrapping="Wrap">
This text has a <Hyperlink RequestNavigate="Hyperlink_RequestNavigate" NavigateUri="https://www.google.com">link</Hyperlink> in it.
</TextBlock>
</Grid>
</Window>
Hyperlink درون صفحات WPF هم استفاده میشه ، که می تونه برای جابجایی بین صفحات باشه. در این مورد شما هیچ ابزار مشخصی برای کنترل رویداد RequestNavigate ندارید، همونطور که ما تو مثال انجام دادیم، اما برای اجرای URL های خارجی از برنامه های معمولی WPF ، مقداری به کمک این رویداد و کلاس Process نیاز داریم . ما به رویداد RequestNavigate اشاره کردیم ، که به ما اجازه میده با یک گرداننده رویداد ( event handler ) ساده لینک ها را در مرورگر پیشفرض کاربر اجرا کنیم ، مثل همین یکی که در کد های برنامه (code Behind) نوشتیم :
private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
System.Diagnostics.Process.Start(e.Uri.AbsoluteUri);
}
المان Run
المان Run به شما امکان می دهد تا یک رشته را با استفاده از تمام ویژگی های موجود در المان Span تنظیم کنید ، اما در حالی که المان Span ممکن است شامل سایر عناصر inline باشد ، یک Run ممکن است فقط حاوی متن ساده باشد. این ویژگی ها باعث می شود تا المان Span انعطافپذیرتر باشد و بنابراین در بیشتر موارد انتخاب منطقی تری باشد.
المان Span
عنصر Span به طور پیش فرض رندر خاصی ندارد، اما به شما امکان می دهد تقریباً هر نوع رندر خاصی از جمله اندازه فونت، سبک و وزن، رنگ های پس زمینه و پیش زمینه و غیره را تنظیم کنید. نکته مهم در مورد عنصر Span این است که اجازه می دهد تا عناصر درون خطی دیگر را در داخل آن قرار دهید و حتی ترکیب های پیشرفته متن و سبک را آسان می کند. در مثال زیر، من از بسیاری از عناصر Span استفاده کردهام تا برخی از احتمالات متعدد هنگام استفاده از عناصر Span درون خطی را به شما نشان دهم:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSpanSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockSpanSample" Height="100" Width="300">
<Grid>
<TextBlock Margin="10" TextWrapping="Wrap">
This <Span FontWeight="Bold">is</Span> a
<Span Background="Silver" Foreground="Maroon">TextBlock</Span>
with <Span TextDecorations="Underline">several</Span>
<Span FontStyle="Italic">Span</Span> elements,
<Span Foreground="Blue">
using a <Bold>variety</Bold> of <Italic>styles</Italic>
</Span>.
</TextBlock>
</Grid>
</Window>
بنابراین همانطور که می بینید، اگر هیچ یک از عناصر دیگر در موقعیت شما معنی ندارد یا اگر فقط می خواهید یک بوم خالی هنگام شروع قالب بندی متن خود داشته باشید، عنصر Span یک انتخاب عالی است.
قالب بندی متن از C#/Code-Behind
همانطور که می بینید، قالب بندی متن از طریق XAML بسیار آسان است، اما در برخی موارد، ممکن است ترجیح دهید یا حتی لازم باشد این کار را از فایل C#/Code-Behind خود انجام دهید. این کمی دست و پا گیرتر است، اما در اینجا یک مثال در مورد نحوه انجام آن وجود دارد:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockCodeBehindSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBlockCodeBehindSample" Height="100" Width="300">
<Grid></Grid>
</Window>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;
namespace WpfTutorialSamples.Basic_controls
{
public partial class TextBlockCodeBehindSample : Window
{
public TextBlockCodeBehindSample()
{
InitializeComponent();
TextBlock tb = new TextBlock();
tb.TextWrapping = TextWrapping.Wrap;
tb.Margin = new Thickness(10);
tb.Inlines.Add("An example on ");
tb.Inlines.Add(new Run("the TextBlock control ") { FontWeight = FontWeights.Bold });
tb.Inlines.Add("using ");
tb.Inlines.Add(new Run("inline ") { FontStyle = FontStyles.Italic });
tb.Inlines.Add(new Run("text formatting ") { Foreground = Brushes.Blue });
tb.Inlines.Add("from ");
tb.Inlines.Add(new Run("Code-Behind") { TextDecorations = TextDecorations.Underline });
tb.Inlines.Add(".");
this.Content = tb;
}
}
}
داشتن این امکان عالی است، و ممکن است در برخی موارد انجام آن به این صورت ضروری باشد، اما این مثال احتمالاً باعث می شود که از XAML بیشتر قدردانی کنید.