2011-08-23 24 views
1

我的第一行看起來是這樣的:收縮列的寬度在WPF的DataGrid中

Title 1 2 3 4 5 6 7 ... 

如果讓我選擇

ColumnWidth="Auto" 

它正確地確定其大小,但之間太多空間列。有沒有辦法縮小呢?我想在我的XAML中,我得到後面的代碼數據做

if (textColumn != 0) { 
textColumn.Width = 8; 
} 

或類似的規定,但尺寸似乎並沒有改變。我不確定這是否正確,因爲我是WPF和C#的新手。謝謝。

編輯:

XAML:

<DataGrid x:Name="dtGridReads" AutoGenerateColumns="False" 
     VirtualizingStackPanel.IsVirtualizing="True"          
     VirtualizingStackPanel.VirtualizationMode ="Standard" 
      EnableColumnVirtualization="True" 
      EnableRowVirtualization="True" 
     ScrollViewer.IsDeferredScrollingEnabled="True" 
     CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True" 
     ItemsSource ="{Binding}" Block.TextAlignment="Center" 
     AlternatingRowBackground="LightGoldenrodYellow" RowBackground="White" 
      CanUserAddRows="False" CanUserDeleteRows="False" FrozenColumnCount="1" 
      GridLinesVisibility="None" Style="{StaticResource ConcensusDataGridStyle}" FontSize="12" > 
</DataGrid> 
+0

爲什麼不在xaml中執行它,如果你在做MVVM,你可以將它綁定到數據綁定中,這樣你就不會使用後面的代碼。順便說一句,你也可以通過百分比來實現!如果您粘貼您的代碼,也許我可以幫助您更多 – Kevin

+0

不知道如何在XAML中執行此操作,因爲第一列與其他列不同。我發佈了我的代碼,以查看是否有助於排查問題。 – Crystal

+0

如果我正確理解你的問題,你想要低於「DataGridColumn」的「最小寬度」。「DataGrid」中的「DataGridColumn」可以變小的程度似乎存在某種限制。我試圖用反射鏡看這個,但找不到這個來源。也嘗試用Snoop改變每一個列標題,拇指,文本塊等,但這並沒有幫助 –

回答

0

您將需要創建一個列的寬度轉換器類,並在值傳遞給轉換器設置相應的大小。

這裏是轉換器

private const double StaticGridWidth = 602; 


public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    if ((value != null) && (parameter != null)) 
    { 
     double newValue = (double)value - StaticGridWidth; 
     double dparam = double.Parse(parameter.ToString()); 
     double width = newValue * (dparam/1000); 
     return (width > 0) ? width : 0; 
    } 

    return null; 
} 

這裏是XAML

<Converters:WidthConverter x:Key="widthConvert" /> 

<GridViewColumn Header="{Binding TypeColumnHeader}" 
           Width="{Binding Path=ActualWidth, ElementName=treeGrid, Converter={StaticResource widthConvert}, ConverterParameter=190}" 

          /> 

注意您傳遞中的值必須是整數,如果你正在建設一個區域性的應用程序的使用。如果你在xaml中使用小數和本地使用小數 - 它會爆炸。

+0

請注意,靜態網格寬度是考慮我的網格中的列我爲其設置了一個靜態寬度。這允許您在同一個網格中混合靜態/動態列寬度,並希望在默認情況下避免滾動條。 – tsells

0

Theres許多方式來做到這一點。

  1. 首先,您需要爲每列創建一列。

所以即,從MSDN

<sdk:DataGrid x:Name="dataGrid4" 
    Height="160" Margin="0,5,0,10" 
    RowHeight="40" AutoGenerateColumns="False" >  
    <sdk:DataGrid.Columns> 
     <sdk:DataGridTextColumn 
      Header="First Name" 
      Width="SizeToHeader" 
      Binding="{Binding FirstName}" 
      FontSize="20" /> 
     <sdk:DataGridTextColumn 
      Header="Last Name" 
      Width="SizeToCells" 
      Binding="{Binding LastName}" 
      FontSize="20" /> 
     <sdk:DataGridTextColumn 
      Header="Address" 
      Width="150" 
      Binding="{Binding Address}" > 
      <sdk:DataGridTextColumn.ElementStyle> 
       <Style TargetType="TextBlock"> 
        <Setter Property="TextWrapping" Value="Wrap"/> 
       </Style> 
      </sdk:DataGridTextColumn.ElementStyle> 
      <sdk:DataGridTextColumn.EditingElementStyle> 
       <Style TargetType="TextBox"> 
        <Setter Property="Foreground" Value="Blue"/> 
       </Style> 
      </sdk:DataGridTextColumn.EditingElementStyle> 
     </sdk:DataGridTextColumn> 
     <sdk:DataGridCheckBoxColumn 
      Header="New?" 
      Width="40" 
      Binding="{Binding IsNew}" /> 
     <sdk:DataGridCheckBoxColumn 
      Header="Subscribed?" 
      Width="Auto" 
      Binding="{Binding IsSubscribed}" 
      IsThreeState="True" /> 
    </sdk:DataGrid.Columns> 
</sdk:DataGrid> 

SizeToHeader意味着它會規模高達基於頭部有多長 上的寬度,你也可以這樣做 寬度=「8」,這意味着你是硬編碼的寬度值作爲8

你也可以做到這一點的百分比

所以讓我們說,你有3列 一個欄寬你想0.3 *,下次要.5×和下次要0.2 *拼成數據網格的100%。你可以說它爲 width =「。5 *」;

你也可以將寬度綁定到某種屬性在你的viewmodel中,如果你想讓它改變,另外你也可以通過轉換器來執行它的狀態和運行。

+0

讓我知道這是否適合你 – Kevin