如何讓過長的字串可以自動變成 「…」 - 從開發人員的角度看 Canvas、Grid

如何讓過長的字串可以自動變成 「…」 - 從開發人員的角度看 Canvas、Grid

在 WPF、Silverlight 還沒有出來之前,想要有下圖這種效果!?

image

預設的控制項都沒有!想要?那就要自已刻一個 Control

 

若是 Web 的話,那就更慘!還要寫一堆的 JS  可以用 CSS3 的 text-ellipse

( 註:感恩 Eric 的提醒,但記得要看瀏覽器有沒有支援 )

 

現在在 WPF、Silverlight 之中一開始就有內建這樣子的屬性

 

尤其是在 Phone 這種小螢幕中更需要

 

基本上很簡單!

 

只要在 TextBlock 再選 屬性 就可以看到 TextTrimming 屬性了

image

接著選 WordEllipsis 就大功告成!

 

但不知是否有人跟我一樣遇到

image

這樣子的情況呢? TextTrimming 明明就設了!

 

但為啥還字還是跑到外面去?

 

Width 是不是設成自動?

Windows Phone 是不是沒有支援這個屬性?

Align 是不是設到 right ?

 

不不不!這個我都檢查過了!但跟 MSDN 上說的就是不一樣 Orz

 

最後跟 Eric 討論時,問了一下這個屬性有沒有用過!?

 

Eric 很順地可以正常轉換成 「…」

 

我心中的 OS :難道真的是 森哥講的 這就是人品問題?

 

這時 Eric 說了關鍵性的一句話!「有沒有用 Grid」?

 

Canvas 改成 Grid 後整個就是 晴天霹靂

 

一切就正常!!

 

----------------------------------------

為什麼 TextBlock 的 TextTrimming 在 Canvas 和 Grid 有不一樣的效果?

----------------------------------------

 

一開始 Canvas 和 Grid 對我來說真的沒有什麼差異

( 就從開發人員的角度而言 )

 

直到 TextTrimming 這個屬性我才直驚覺到差異很大…

 

每次看在 MSDN、書籍在介紹 Canvas 、Grid 、StackPanel

都是在說物件是怎麼排列的之類

面板名稱

說明

Canvas

定義一個區域,您可以在這個區域內依據相對於 Canvas 區域的座標,明確放置子項目。

Grid

定義由資料行和資料列組成的彈性方格區域。

StackPanel

將子項目排列在可為水平或垂直方向的單一行中。

實際上真的沒有什麼感覺!好像跟開發人員沒關係

反正畫面出來長的一樣,剩下的就隨便啦!

 

 

查了很久總算有一個可以說服我的了!

MSDN 的 Silverlight 配置系統

http://msdn.microsoft.com/zh-tw/library/cc645025(v=vs.95).aspx#LayoutSystem_LayoutSystem

 

簡單來說!

就是 Canvas 是用一種絕對位置當做座標!

即使畫面放大、縮小、超出 Canvas 範圍 內容 都不會受到任何影響!

 

而 Grid 則是會依畫面變小而改變 Grid 內的控制項

也不允許 內容超出 控制項範圍!

 

所以才會造成在 Canvas 中

即使設定了 TextTrimming  過長的字串依然會跑到外面去的情況發生

 

以後大家就不會分不清楚到底要用那一個了 微笑

 

參考資料

Silverlight 配置系統

http://msdn.microsoft.com/zh-tw/library/cc645025(v=vs.95).aspx#LayoutSystem_LayoutSystem

Grid 類別

http://msdn.microsoft.com/zh-tw/library/system.windows.controls.grid(v=vs.95).aspx

Canvas 類別

http://msdn.microsoft.com/zh-tw/library/system.windows.controls.canvas(v=vs.95).aspx