TOC

This article is currently in the process of being translated into Persian (~59% done).

Basic controls:

The TextBlock control - Inline formatting

در این مقاله به بررسی عملکرد اصلی کنترل TextBlock پرداخته ایم: نمایش یک متن ساده و در بر گرفتن کل متن در صورت لزوم. ما حتی رنگی غیر از رنگ پیش فرض را برای نمایش متن استفاده کرده ایم، اما چه کنیم اگر بخواهیم بیشتر از یک رنگ ثابت برای تمام متن داخل TextBlock تعیین کنیم؟

خوشبختانه کنترل TextBlock از عناصر در متنی پشتیبانی می کند. این سازه های کنترل-مانند همگی از کلاس در متن ارث بری می کنند، بدین معنی که می توان از آنها به صورت در متن و به صورت قسمتی از یک متن بزرگتر استفاده کرد. همانگونه که می نویسیم، این عناصر پشتیبانی شده شامل این موارد می شود: بلوک لنگر، خط ضخیم، لینک پیوند، InlineUIContainer، خط کج، جدا ساز خط، اجرا کننده، گستره و زیر خط.

Bold, Italic and Underline

اینها احتمالا ساده ترین نوع المان های خطی هستند. اسمشون همه چیز رو راجع به کاربردشان بیان می کند ، اما ما همچنان یه مثال سریع برای چگونگی استفاده از آن ها را در اختیار شما قرار میدیم:

<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

The Run element allows you to style a string using all the available properties of the Span element, but while the Span element may contain other inline elements, a Run element may only contain plain text. This makes the Span element more flexible and therefore the logical choice in most cases.

Span

The Span element doesn't have any specific rendering by default, but allows you to set almost any kind of specific rendering, including font size, style and weight, background and foreground colors and so on. The great thing about the Span element is that it allows for other inline elements inside of it, making it easy to do even advanced combinations of text and style. In the following example, I have used many Span elements to show you some of the many possibilities when using inline Span elements:

<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>

So as you can see, if none of the other elements make sense in your situation or if you just want a blank canvas when starting to format your text, the Span element is a great choice.

Formatting text from C#/Code-Behind

As you can see, formatting text through XAML is very easy, but in some cases, you might prefer or even need to do it from your C#/Code-Behind file. This is a bit more cumbersome, but here's an example on how you may do it:

<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;
		}
	}
}

It's great to have the possibility, and it can be necessary to do it like this in some cases, but this example will probably make you appreciate XAML even more.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!