如果在專案中必需使用ListBox做為物件呈現的容器時,若使用預設的Template,當在執行期改變ListBox寬度的時候,可能會發現,裡面的項目大小並不會跟著ListBox縮放;就算把裡面的項目水平對齊方式改為Stretch,它還是會依然故我,不管ListBox寬度的變化。
如果在專案中必需使用ListBox做為物件呈現的容器時,若使用預設的Template,當在執行期改變ListBox寬度的時候,可能會發現,裡面的項目大小並不會跟著ListBox縮放;就算把裡面的項目水平對齊方式改為Stretch,它還是會依然故我,不管ListBox寬度的變化。
但是如果直接把ListBox中的項目寬度直接寫死的話,又很容易影響整體的美感,之前在網路上有找到利用TemplateBinding來讓ListBoxItem的寬度和ViewPort的寬度做繫結的辦法,但是那個方法會使得ListBox的水平ScrollBar一直出現在畫面上,若ListBox調整大小,整個佈局也會跟著「走精」。
不過,其實只要針對ListBox的ItemContainerStyle下手,強制讓ListBoxItem的HorizontalContentAlignment屬性設為Stretch就行啦!!
讓我們來看看下面的範例:
*若將滑鼠移到以左右兩個ListBox中的項目上,或是利用兩個ListBox中間的GridSplitter改變ListBox的大小,就可以看出明顯的差異。
上面的範例中,左右兩個ListBox裡面的項目都被包在一個Grid中,但是左邊ListBox裡的Grid寬度是固定的,所以不管ListBox的寬度改為多少,裡面的Buy按鈕都還是保持在同一個地方,而右邊的ListBox裡的Grid,則會隨著ListBox自動調整寬度,所以Buy按鈕始終會貼齊ListBox的右側。
要做到像右邊的ListBox的效果,只需要在Resorce中加入以下的XAML:
並且將ListBox的ItemContainerStyle設為{StaticResource ListBoxItemStyle}就行啦~~
來看看完整的XAML:
就這麼簡單!!
最後一樣附上專案原始碼,請自行服用: