Dot-Net
如何獲得 ListView GridViewColumn 來填充網格中的剩餘空間?
我想創建一個具有固定寬度的兩列和第三列以填充剩餘空間的 ListView。所以是這樣的:
<ListView> <ListView.View> <GridView> <GridViewColumn Header="Name" Width="*" /> <GridViewColumn Header="Age" Width="50" /> <GridViewColumn Header="Gender" Width="50" /> </GridView> </ListView.View> </ListView>問題是我找不到讓
Name列填充剩餘空間的方法,因為將寬度設置為*不起作用。看起來有一種方法可以使用值轉換器來做到這一點,但似乎應該有一種更簡單的方法。與 DataGrid 控制項一樣,您可以使用*s 指定列的寬度。
問題是 GridViewColumn 的列寬是雙倍的,而不是 GridLength 對象,並且沒有適當的轉換來處理 *. 不確定這是否是 WPF 團隊的疏忽。你會認為它應該被支持。
除了轉換器,我見過的唯一其他方法是在這裡: http ://www.ontheblog.net/CMS/Default.aspx?tabid=36&EntryID=37 。
兩者都是不需要的額外工作。我在 ListView 和 GridView 組合中發現了其他“奇怪”的東西,所以我停止使用它們。如果我需要一個數據網格,我使用我們許可的第 3 方,如果我需要一個複雜的 ListBox 樣式菜單,我只使用一個模板化的 ListBox。
我試圖實現相同的目標,但後來決定我希望我的 ListView 列消耗 ListView 的一部分,結果是所有列都消耗一部分空間,並且所有空間都在 ListView 中消耗。您可以將其設置為在最後一列具有任何您喜歡的百分比,以直接實現“填充最後一列的剩餘空間”目標。
我發現這種方法相當健壯和可靠(即使在調整大小時!)所以我想我可以分享。
對於此範例,我的 ListView 中有四列。您只需要
SizeChanged使用以下事件處理程序在您的 ListView 中註冊事件:private void ProductsListView_SizeChanged(object sender, SizeChangedEventArgs e) { ListView listView = sender as ListView; GridView gView = listView.View as GridView; var workingWidth = listView.ActualWidth - SystemParameters.VerticalScrollBarWidth; // take into account vertical scrollbar var col1 = 0.50; var col2 = 0.20; var col3 = 0.15; var col4 = 0.15; gView.Columns[0].Width = workingWidth*col1; gView.Columns[1].Width = workingWidth*col2; gView.Columns[2].Width = workingWidth*col3; gView.Columns[3].Width = workingWidth*col4; }