2010-08-04 15 views
28

什麼是最佳/正確的方式來使一組列具有成比例的寬度(Width="\*"),但它們的最小值爲寬度至少爲他們的內容的寬度?目前,如果我使用Width="*",那麼列保持完全成比例,但是如果列太細,內容會被裁剪。如果我使用Width="Auto",那麼列的大小與它們的內容完全一致,但是這使他們所有不同的尺寸WPF - 具有Width =「*」的DataGrid列,但MinWidth擬合內容

我想要的是真正的兩個組合,如Width="\*"MinWidth="Auto",以便當有額外的寬度列將所有空間等於寬度,但當網格變小時,內容不會被裁剪。

不幸的是,MinWidth="Auto"不存在,所以我想我需要綁定列的MinWidth屬性,但很難弄清楚我將它綁定到什麼。

如何告訴WPF "MinWidth="該列最寬的內容的寬度?

+1

使我們能夠設置MinWidth =「auto」將是一個很好的功能。 – 2011-05-25 20:21:55

回答

11

在XAML中設置Width = "Auto"

然後在代碼:

MinWidth = ActualWidth 
Width = new GridLength(1, GridUnitType.Star) 
+1

爲我工作。循環遍歷網格中的所有列,並在其中執行上面的代碼。把循環放入網格的Loaded事件處理程序 – saus 2011-02-18 00:12:50

+0

花了我一段時間,即使有這種幫助弄清楚。看到我的答案在http://stackoverflow.com/questions/13631694/wpf-datagrid-column-width-auto-and-scrollbar – Brent 2012-11-29 19:15:16

18

我知道它有點晚了,但我發現你的問題和編程的純XAML的解決方案。

<ColumnDefinition Width="42*" MinWidth="{Binding Path=ActualWidth, ElementName=projectInfoHeader }"/> 

其中ElementName指向佔據了大部分空間的控件。當然,這隻適用於寬度有限的元素。 例如,如果您爲GroupBox執行此操作,則只能調整爲較大的寬度,而不能調整爲較小的寬度。

如果你有幾個候選人的MinWidth的價值,你需要自己寫一個IMultiValueConverter,這需要一個Object [],它解析成浮點數,如果你只使用它返回最大(它只是1 LINQ查詢你自己也不需要處理轉換器的不良使用)

這種方式也支持動態改變MinWidth

1

爲該列的名稱在XAML:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="*" Name="Col1"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
</Grid> 

然後在代碼中設置的MinWidth屬性如下圖所示:

public MainWindow() 
{ 
    InitializeComponent(); 

    Col1.MinWidth = 340; //enter desired minimum width here 
} 
+0

您可以添加Minwidth和Maxwidth作爲列屬性。無需添加背後的代碼 – 2017-07-20 10:03:38

2

我也有問題,大小格列正確內GridViewColumn。我嘗試了幾件事,但後來我找到了UniformGrid。這對我來說是最終的解決方案。它只是工作。我之前並不知道它......它似乎並不存在於VS工具箱默認情況下(?),因此不知道它甚至存在。

你可以從here找到更多關於UniformGrid的內容。

0

只要您可以使用下面的代碼來設置列

<ColumnDefinition Width="*" MaxWidth="40"/> 

這將需要的可用空間的最大或最小寬度,但它會限制到最大40像素

你可以用minwidth相同也

<ColumnDefinition Width="*" MinWidth="50"/> 

這將採取可用空間,但始終確保它至少有50px空間。 希望這會有所幫助。