2012-06-01 204 views
2

我有2個DataGrid。爲了讓它們變得漂亮,我對它們做了一些造型。我定義了CellTemplate和HeaderTemplate,並將它們以隱式Style應用於DataGrid。我在XAML中添加顏色並保留它們。他們也有HeaderTemplates。WPF DataGrid列忽略寬度

編輯: 我已經嘗試了一些其他場景,所以這裏的多一些上會發生什麼:

DataGrid的「A」正常工作。它完全從XAML開始。它接受各種寬度(包括星號)並正確顯示。它放置在具有虛擬機的用戶控件中。這裏的XAML:

<DataGrid ItemsSource="{Binding Items}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Name}" Header="Name" MinWidth="50" Width="250" HeaderTemplate="{StaticResource DefaultDataGridHeader}"/> 
     <DataGridTextColumn Binding="{Binding StartDate}" Header="Start" MinWidth="50" Width="150" HeaderTemplate="{StaticResource DefaultDataGridHeader}" /> 
     <DataGridTextColumn Binding="{Binding FinishDate}" Header="Finish" MinWidth="50" Width="150" HeaderTemplate="{StaticResource DefaultDataGridHeader}" /> 
     <DataGridTextColumn Binding="{Binding Leader}" Header="Leader" MinWidth="50" Width="*" HeaderTemplate="{StaticResource DefaultDataGridHeader}" /> 
    </DataGrid.Columns> 
</DataGrid> 

再有就是DataGrid中乙...

這是一個有點複雜了。有一個控件顯示DataGrid B並執行一些其他操作。它用在許多其他視圖中,具有不同的數據。因此,對於每個數據都有另一個包含DataGrid列的View。當數據到達主控制器時,它將清除DataGrid B的列並使用相應視圖中定義的列重新填充它。

下面是在用戶控件的DataGrid B:

<DataGrid x:Name="datagrid" ItemsSource="{Binding Items}" IsReadOnly="True" SelectionMode="Single" /> 

的用戶控件具有的ObservableCollection GridColumns DependencyProp。這是實際的DataGridColumns到達的地方。所以在CollectionChanged事件我這樣做:

void GridColumnsCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
{ 
    datagrid.Columns.Clear(); 
    foreach (var gridColumn in GridColumns) 
    { 
     datagrid.Columns.Add(gridColumn); 
    } 
} 

下面是我如何設置特定的數據視圖的實際列的例子:

<c:GenericList > 
    <c:GenericList.GridColumns> 
      <DataGridTextColumn Binding="{Binding Name}" Header="Name" 
      Width="300" HeaderTemplate="{StaticResource DefaultDataGridHeader}"/> 
    </c:GenericList.GridColumns> 
</c:GenericList> 

--------帶會發生什麼DataGrid B:--------

  • 如果我像這樣離開XAML,該列將以300 px寬度呈現。
  • 如果我將寬度改爲星號,或者添加其他具有星號的列,它們將以20px寬度呈現。 (即使標題中有一些文字)
  • 如果我設置了MinWidth,則所有星號大小的列都使用MinWidth進行渲染。

  • 如果我忽略了「從另一個視圖中放置列」部分,並直接將一些列 添加到datagrid中,那麼像素大小列跨度爲標題文本的寬度,星形大小列呈現寬度爲20px。另外,如果我在運行的應用程序中調整星號化列的大小,則會發生一些寬度限制,我無法再將這些列再縮小。 - 但在這個版本中,沒有數據要綁定到列。這可能會導致這種影響?

//編輯結束。

樣式是在Blend中用「編輯副本」功能製作的。

他們是這樣的:

<Style x:Key="DefaultDataGridColumnHeaderStyle" TargetType="{x:Type DataGridColumnHeader}"> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridColumnHeader}"> 
       <Grid > 
        <Microsoft_Windows_Themes:DataGridHeaderBorder BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" 
                    IsClickable="{TemplateBinding CanUserSort}" IsPressed="{TemplateBinding IsPressed}" IsHovered="{TemplateBinding IsMouseOver}" 
                    Padding="{TemplateBinding Padding}" SortDirection="{TemplateBinding SortDirection}" SeparatorBrush="{TemplateBinding SeparatorBrush}" 
                    SeparatorVisibility="{TemplateBinding SeparatorVisibility}" Background="#00000000"> 
         <Grid> 
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
               VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
          <Rectangle StrokeThickness="0" RadiusY="0" Opacity="0"> 
           <Rectangle.Fill> 
            <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
             <GradientStop Color="#33000000" Offset="1"/> 
             <GradientStop Color="#4CFFFFFF"/> 
             <GradientStop Color="#007B7B7B" Offset="0.35"/> 
            </LinearGradientBrush> 
           </Rectangle.Fill> 
          </Rectangle> 
         </Grid> 
        </Microsoft_Windows_Themes:DataGridHeaderBorder> 
        <Thumb x:Name="PART_LeftHeaderGripper" HorizontalAlignment="Left" Style="{StaticResource ColumnHeaderGripperStyle}" Width="8"/> 
        <Thumb x:Name="PART_RightHeaderGripper" HorizontalAlignment="Right" Style="{StaticResource ColumnHeaderGripperStyle}" Width="8"/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<DataTemplate x:Key="DefaultDataGridHeader"> 
    <Border BorderBrush="{DynamicResource ShadowBrush}" Background="{x:Null}" d:DesignWidth="289" d:DesignHeight="72.28"> 
     <Grid> 
      <Rectangle RadiusY="0" StrokeThickness="0" Fill="{DynamicResource ActionTileBrush}" /> 
      <Rectangle RadiusY="0" StrokeThickness="0" > 
       <Rectangle.Fill> 
        <SolidColorBrush Color="#88FFFFFF" /> 
       </Rectangle.Fill> 
      </Rectangle> 
      <TextBlock Text="{Binding}" Margin="12" FontSize="16" FontWeight="Bold"> 
       <TextBlock.Foreground> 
        <SolidColorBrush Color="#FF11789D" /> 
       </TextBlock.Foreground> 
      </TextBlock> 
      <Rectangle RadiusY="0" StrokeThickness="1" Stroke="{DynamicResource ShadowBrush}"></Rectangle> 
     </Grid> 
    </Border> 
</DataTemplate> 


<Style x:Key="DefaultDataGridCellStyle" TargetType="{x:Type DataGridCell}"> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="BorderBrush" Value="Transparent"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGridCell}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True" Padding="12,8"> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="{DynamicResource HighlightBrush}"/> 
     </Trigger> 
     <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
      <Setter Property="BorderBrush" Value="{DynamicResource HighlightBrush}"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 



<Style x:Key="DefaultDataGridStyle" TargetType="{x:Type DataGrid}"> 
    <Setter Property="AlternatingRowBackground" Value="{x:Null}"/> 
    <Setter Property="AlternationCount" Value="2"/> 
    <Setter Property="AutoGenerateColumns" Value="False"/> 
    <Setter Property="Background" Value="{x:Null}"/> 
    <Setter Property="BorderBrush" Value="{DynamicResource ChromeBrush}"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="CellStyle" Value="{StaticResource DefaultDataGridCellStyle}"/> 
    <Setter Property="ColumnHeaderStyle" Value="{StaticResource DefaultDataGridColumnHeaderStyle}"/> 
    <Setter Property="Foreground" Value="{DynamicResource ForegroundBrush}"/> 
    <Setter Property="HorizontalGridLinesBrush" Value="{DynamicResource ShadowBrush}"/> 
    <Setter Property="RowBackground" Value="{DynamicResource BackgroundBrush}"/> 
    <Setter Property="RowDetailsVisibilityMode" Value="VisibleWhenSelected"/> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="true"/> 
    <Setter Property="ScrollViewer.PanningMode" Value="Both"/> 
    <Setter Property="Stylus.IsFlicksEnabled" Value="True"/> 
    <Setter Property="VerticalGridLinesBrush" Value="{DynamicResource ShadowBrush}"/> 
    <Setter Property="VerticalContentAlignment" Value="Stretch"/> 
    <Setter Property="HorizontalContentAlignment" Value="Stretch"/> 
    <Style.Triggers> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

顯然有什麼不對的地方,我應該能夠設置列的明星大小,如果將它們設置爲像素大小我希望他們能保持這種。

謝謝你的幫助!

+0

我認爲這是不正確大小的網格。請張貼正確尺寸的網格的xaml。 – Paparazzi

+0

我還沒有發佈其他的,因爲它完全一樣,只與其他綁定。 – Tenshiko

+0

好吧,我把它們混淆了一下,並更新了問題,以便上面有更多信息。 – Tenshiko

回答

0

希望的空間是存在在你的XAML中之間BindingWidth

+0

是的,這是一個複製粘貼錯誤,但它們在我的代碼中分開。 – Tenshiko

0

是承載第二個DataGrid設置爲Stretch是UserControl的Horizo​​ntalAlignment第二DataGridTextColumn? 我會嘗試將UserControl的Horizo​​ntalAlignment設置爲拉伸 - 也許這是限制DataGrid的大小。