Thiết TextBlock.IsHypenationEnabled
true thực sự sẽ làm điều gì đó tương tự như thế, nhưng nếu bạn muốn sử dụng thẻ, bạn có thể sử dụng một phương pháp như thế này:
/// <summary>
/// Adds break to a TextBlock according to a specified tag
/// </summary>
/// <param name="text">The text containing the tags to break up</param>
/// <param name="tb">The TextBlock we are assigning this text to</param>
/// <param name="tag">The tag, eg <br> to use in adding breaks</param>
/// <returns></returns>
public string WordWrap(string text, TextBlock tb, string tag)
{
//get the amount of text that can fit into the textblock
int len = (int)Math.Round((2 * tb.ActualWidth/tb.FontSize));
string original = text.Replace(tag, "");
string ret = "";
while (original.Length > len)
{
//get index where tag occurred
int i = text.IndexOf(tag);
//get index where whitespace occurred
int j = original.IndexOf(" ");
//does tag occur earlier than whitespace, then let's use that index instead!
if (j > i && j < len)
i = j;
//if we usde index of whitespace, there is no need to hyphenate
ret += (i == j) ? original.Substring(0, i) + "\n" : original.Substring(0, i) + "-\n";
//if we used index of whitespace, then let's remove the whitespace
original = (i == j) ? original.Substring(i + 1) : original.Substring(i);
text = text.Substring(i + tag.Length);
}
return ret + original;
}
Bằng cách này bạn có thể nói:
textBlock1.Text = WordWrap("StackOver<br>Flow For<br>Ever", textBlock1, "<br>");
Điều này sẽ ra:
Tuy nhiên, bằng cách sử dụng chỉ IsHyphenated mà không cần thẻ, nó sẽ là:
Trong khi:
textBlock1.Text = WordWrap("StackOver<br>Flow In<br> U", textBlock1, "<br>");
chí đầu ra:
Và IsHyphenated mà không cần thẻ:
EDIT: On giảm kích thước font chữ, tôi phát hiện ra rằng mã đầu tiên tôi được đăng không thích thêm phá vỡ nơi khoảng trắng xảy ra để người dùng chỉ định phá vỡ.
Nguồn
2012-07-13 07:06:02
Cảm ơn bạn! Điều này trông giống như những gì tôi muốn. Phải thử nó trước khi chấp nhận như vậy. –
Hoạt động tốt, chỉ cần thực hiện hai thay đổi nhỏ: 1. textBlock1 được thay thế bằng tham số tb 2. // lấy chỉ mục nơi thẻ xảy ra int i = text.IndexOf (thẻ); nếu (i <0) { trả lại lần lượt + văn bản; } –
Cảm ơn, tôi thực sự nghĩ rằng tôi đã cập nhật điều này ... Để kiểm tra xem thẻ có tồn tại hay không, không cần thiết nếu bạn chỉ sử dụng nó cho các văn bản cần thẻ, nếu bạn muốn tất cả TextBlocks của mình có tính năng, bạn nên thực hiện điều khiển tùy chỉnh và ghi đè thuộc tính thay đổi văn bản ... –