Dot-Net

如何獲得 ListView GridViewColumn 來填充網格中的剩餘空間?

  • November 30, 2011

我想創建一個具有固定寬度的兩列和第三列以填充剩餘空間的 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;
}

引用自:https://stackoverflow.com/questions/8331940