TOC

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

Các control cơ bản:

TextBlock control - Định dạng nội tuyến

Trong bài viết trước chúng ta đã xem xét chức năng cơ bản của TextBlock control: hiện thị 1 chuỗi đơn giản và xuống dòng nếu cần thiết. Chúng ta thậm chí đã sử dụng màu khác với mặc định để hiển thị text, nhưng sẽ ra sao nếu bạn muốn làm nhiều hơn là việc chỉ định nghĩa màu tĩnh cho tất cả các TextBlock?

May mắn là TextBlock control hỗ trợ nội dung nội tuyến (inline). Những phần tử giống control nhỏ đều được xậy để thừa kế từ lớp Inline, có nghĩa là chúng có thể được thể hiện nội tuyến, như một phần của 1 text lớn. Giống như lối viết, những phần tử hỗ trợ bao gồm AnchoredBlock, Bold, Hyperlink, InlineUIContainer, Italic, LineBreak, Run, Span, và Underline. Trong ví dụ sau, chúng ta sẽ có cái nhìn về hầu hết chúng.

Bold, Italic và Underline

Đây chắc chắn là những kiểu đơn giản nhất của các phần từ nội tuyến. Những cái tên đã cho bạn biết về công dụng của chúng, nhưng chúng tôi sẽ cho bạn 1 ví dụ nhanh về cách sử dụng chúng:

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

Cũng giống như HTML, bạn chỉ việc bao bọc text của bạn bắng 1 thẻ Bold để in đậm text và tương tự như thế trên các phần tử khác. Nó làm cho việc hiển thị những text linh tinh trên ứng dụng của bạn rất dễ dàng.

Cả ba thẻ trên đều là những lớp con của phần tử Span, ứng với mỗi một thiết lập trên thuộc tính nhất định của Span để tạo được hiệu ứng mong muốn. Chẳng hạn, thẻ Bold là thiết lập thuộc tính FontWeight trên phần tử gạch dưới, phần tử Italic là thiết lập FontStyle v.v...

LineBreak

Đơn giản chèn 1 line break vào trong text. Vui lòng xem chương trước để thấy ví dụ về cách chúng tôi sử dụng phần tử LineBreak.

Hyperlink

Phần tử Hyperlink cho phép bạn có những liên kết trong text của bạn. Nó được hiển thị với 1 kiểu cách phù hợp với theme mặc định của Windows, nó thông thường là loại chữ màu xanh và gạch dưới với 1 hiệu ứng màu chữ đỏ khi rê chuột qua. Bạn có thể sử dụng thuộc tính NavigateUri để xác định URL mà bạn muốn nó trỏ tới. Đây là một ví dụ:

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

Siêu liên kết cũng được sử dụng bên trong trang WPF, nơi nó có thể được sử dụng để điều hướng giữa các trang. Trong trường hợp đó, bạn sẽ không phải xử lý cụ thể sự kiện RequestNavigate, như chúng ta làm trong ví dụ, nhưng để khởi chạy URL bên ngoài từ một ứng dụng WPF thông thường, chúng ta cần một chút trợ giúp từ sự kiện này và lớp Process. Chúng tôi đăng ký sự kiện RequestNavigate, cho phép chúng tôi khởi chạy URL được liên kết trong trình duyệt mặc định của người dùng bằng trình xử lý sự kiện đơn giản như trình xử lý sự kiện này trong đoạn mã phía sau tệp:

private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
	System.Diagnostics.Process.Start(e.Uri.AbsoluteUri);
}

Run

Phần tử Run cho phép bạn tạo kiểu cho chuỗi bằng cách sử dụng tất cả các thuộc tính có sẵn của phần tử Span, nhưng trong khi phần tử Span có thể chứa các phần tử nội tuyến khác, phần tử Run chỉ có thể chứa văn bản thuần túy. Điều này làm cho phần tử Span linh hoạt hơn và do đó lựa chọn hợp lý trong hầu hết các trường hợp.

Span

Phần tử Span không có bất cứ kết xuất cụ thể theo mặc định, nhưng cho phép bạn thiết lập hầu hết mọi loại kết xuất cụ thể, bao gồm cả font size, style và weight, background and foreground colors, v.v... Điểm tốt nhất của phần tử Span là nó cho phép các phần tử inline khác bên trong nó, làm cho nó dễ dàng thực hiện ngay cả các kết hợp văn bản và style. Trong ví dụ sau, tôi có sử dụng một số phần tử Span để hiện thị cho bạn một trong số khả năng khi sử dụng các phần tử inline 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>

Như bạn có thể thấy, nếu không phần tử nào khác được hiểu trong trường hợp của bạn hoặc nếu bạn chỉ muốn 1 blank canvas khi bắt đầu định dạng text của bạn, phần tử Span là 1 sự lựa chọn tốt nhất.

Định dạng text từ C#/Code-Behind

Như bạn có thể thấy, định dạng text thông qua XAML là rất đơn giản, nhưng trong một vài trường hợp, bạn sẽ muốn hoặc thậm chí cần định dạng từ C#/Code-Behind file của bạn. Điều này có chút ít dài dòng, nhưng đây là 1 ví dụ về cách bạn làm việc với nó:

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

Thật là tuyệt khi có khả năng này, và nó có thể cần thiết trong một vài trường hợp, nhưng ví dụ này chắc chắn sẽ khiến bạn hiểu rõ hơn về XAML.

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!