2012-06-01 18 views
2

У меня есть 2 DataGrids. Чтобы сделать их красивыми, я сделал несколько стилей на них. Я определил CellTemplate и HeaderTemplate и применил их в неявном стиле к DataGrid. Я добавляю coloumns в XAML и оставляю их. У них также есть HeaderTemplates.Столбец WPF DataGrid игнорирует ширину

EDIT: Я пробовал некоторые другие сценарии, так что вот еще немного о том, что происходит:

DataGrid «A» работает отлично. Он полностью инициирован XAML. Он принимает все виды ширины (включая размер звезды) и отображается правильно. Он помещается внутри UserControl с виртуальной машиной. Вот 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 B ...

Это немного сложнее в настоящее время. Есть элемент управления, который отображает DataGrid B и выполняет некоторые другие действия. Он используется во многих других Представлениях с разными данными. Таким образом, для каждого данных есть другой вид, содержащий столбцы DataGrid. Когда данные поступают в главный элемент управления, он очищает столбцы DataGrid B и повторно заполняет их теми, которые определены в соответствующем представлении.

Вот DataGrid B в UserControl:

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

UserControl имеет 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 пикселей.
  • Если я изменяю ширину до размера звезды или добавляю любые другие столбцы со звездным размером, они получаются с шириной 20 пикселей. (даже если в заголовке есть какой-то текст)
  • Если я установил MinWidth, то все столбцы размером с звездой отображаются с помощью MinWidth.

  • Если я не укажу часть «размещение столбцов из другого вида» и добавлю несколько столбцов непосредственно в datagrid, тогда столбцы размера пикселя будут охватывать ширину текста заголовка и столбцы размера звезды с шириной 20 пикселей. Кроме того, если я изменяю размер столбца с звездочками в запущенном приложении, меняются ограничения ширины, и я больше не могу сделать столбцы маленькими. - Но в этой версии нет данных для привязки к столбцам. Может ли это вызвать этот эффект?

// конец EDIT.

Стили были сделаны в 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

Я не размещал другого, потому что он точно такой же, только с другими Bindings. – Tenshiko

+0

Хорошо, я перепутал с ними немного больше, и обновил вопрос, так что больше информации выше. – Tenshiko

ответ

0

Надежда пространство есть в вашем XAML во втором DataGridTextColumn в-между Binding и Width

+0

Да, это была ошибка копирования-вставки, но они разделены в моем коде. – Tenshiko

0

ли HorizontalAlignment из UserControl, на котором размещен второй DataGrid набор Протянуть? Я бы постарался установить HorizontalAlignment UserControl для растяжки - возможно, это ограничение размера DataGrid.

Смежные вопросы