У меня есть 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>
Очевидно, что что-то не так-то и я должен быть в состоянии установить столбцы снимется размер, или, если установить их размер пикселя я ожидаю, что они держать это.
Благодарим за помощь!
Я принимаю, что это сетка, которая не имеет правильного размера. Пожалуйста, разместите xaml для сетки, которая делает размер правильно. – Paparazzi
Я не размещал другого, потому что он точно такой же, только с другими Bindings. – Tenshiko
Хорошо, я перепутал с ними немного больше, и обновил вопрос, так что больше информации выше. – Tenshiko