对于我的WPF Toolkit DataGrid,我使用以下自定义列标题样式:
<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Vertical" HorizontalAlignment="Stretch" Background="LightYellow">
<TextBlock Text="{Binding Name}" HorizontalAlignment="Stretch" TextAlignment="Left" Background="LightGreen" />
<TextBlock Text="{Binding Data}" HorizontalAlignment="Stretch" TextAlignment="Right" Background="LightBlue" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
标头的DataContext在代码中设置,并且使用DataGrid的初始宽度正确显示Name和Data字符串属性,如下所示:
---------------
|Name |
| Data|
---------------
但是,当我调整列的大小时,标题显示不会重排,而是保持不变:
--------------------
|Name |
| Data |
--------------------
我认为它看起来像这样:
--------------------
|Name |
| Data|
--------------------
我需要做些什么才能获得上述所需的行为?
同样,标题内容似乎也没有在垂直方向上拉伸。
更新 添加
<Setter Property="VerticalAlignment">
<Setter.Value>Bottom</Setter.Value>
</Setter>
到样式似乎正确地将标题对齐到底部。不幸的是,将HorizontalAlignment属性设置为'Stretch'并不像我正在寻找的那样。
Repro的详细信息: 以下是演示行为的代码段。
Window1.xaml:
<Window x:Class="GridTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300" xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit">
<Window.Resources>
<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<DockPanel>
<TextBlock DockPanel.Dock="Left" Text="{Binding Name}" />
<TextBlock DockPanel.Dock="Right" Text="{Binding Data}" />
</DockPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
<Style x:Name="RowHeaderStyle" x:Key="RowHeaderStyle" TargetType="my:DataGridRowHeader">
<Setter Property="Content" Value="{Binding}" />
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Content.Name, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type my:DataGridRowHeader}}}"
VerticalAlignment="Center"/>
<TextBlock Padding="5">|</TextBlock>
<TextBlock Text="{Binding Path=Content.Data, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type my:DataGridRowHeader}}}"
VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<Grid>
<my:DataGrid Name="dg"
ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"
RowHeaderStyle="{StaticResource RowHeaderStyle}"
HeadersVisibility="All">
</my:DataGrid>
</Grid>
</Window>
和Window1.xaml.cs中的代码隐藏
using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;
using Microsoft.Windows.Controls;
using SLModel;
namespace GridTest
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
Inputs = new List<Input>();
Outputs = new List<Output>();
Input i1 = new Input() { Name = "I 1", Data = "data 1" };
Input i2 = new Input() { Name = "I 2", Data = "data 2" };
Input i3 = new Input() { Name = "I 3", Data = "data 3" };
Inputs.Add(i1); Inputs.Add(i2);
Output o1 = new Output() { Name = "O 1", Data = "data 1" };
Output o2 = new Output() { Name = "O 2", Data = "data 2" };
Output o3 = new Output() { Name = "O 3", Data = "data 3" };
Outputs.Add(o1); Outputs.Add(o2); Outputs.Add(o3);
Relationship r1 = new Relationship() { Formula = "F1" };
Relationship r2 = new Relationship() { Formula = "F2" };
Relationship r3 = new Relationship() { Formula = "F3" };
Relationship r4 = new Relationship() { Formula = "F4" };
Relationship r5 = new Relationship() { Formula = "F5" };
Relationship r6 = new Relationship() { Formula = "F6" };
i1.Relationships.Add(r1);
i1.Relationships.Add(r2);
i2.Relationships.Add(r3);
i2.Relationships.Add(r4);
i3.Relationships.Add(r5);
i3.Relationships.Add(r6);
CreateColumn(o1, 0);
CreateColumn(o2, 1);
CreateColumn(o3, 2);
dg.Items.Add(i1);
dg.Items.Add(i2);
dg.Items.Add(i3);
dg.ColumnWidth = DataGridLength.SizeToHeader;
}
private void CreateColumn(Output output, int index)
{
Binding textBinding = new Binding();
textBinding.Path = new PropertyPath(string.Format("Relationships[{0}].Formula", index));
textBinding.Mode = BindingMode.TwoWay;
DataGridTextColumn tc = new DataGridTextColumn();
tc.Binding = textBinding;
dg.Columns.Add(tc);
tc.Header = output;
}
private List<Output> Outputs { get; set; }
private List<Input> Inputs { get; set; }
}
}
使用简单的类输入,输出和关系:
公共类输入 { 公共输入() { Relationships = new ObservableCollection(); }
public string Name { get; set; }
public string Data { get; set; }
public ObservableCollection<Relationship> Relationships { get; set; }
}
公共类输出 { public Output(){}
public string Name { get; set; }
public string Data { get; set; }
}
公共阶级关系 { 公共关系() { } 公共字符串公式{get;组; } }
Repro步骤:
启动申请
观察列标题'O 1data 1','O 2data 2'和'O 3data 3'
将列分隔符拖到右侧
观察到'Name'TextBlock(在本例中为'O 1')与'Data'TextBlock('data 1')之间的距离没有变化,即'Data'TextBlock不是'停靠'到列标题的右边缘。
答案 0 :(得分:4)
我建议您使用StackPanel
替换Grid
:
<Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Row="0" Grid.Column="0" Text="{Binding Name}" Background="LightGreen" />
<TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding Data}" Background="LightBlue" />
</Grid>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
如果这不起作用,您可能需要修改ControlTemplate
的{{1}}。我不确定默认模板是什么样的,但如果DataGridColumnHeader
不在可伸缩容器内(如ContentPresenter
),那么伸展Grid
内部的内容无关紧要1}},它不会伸展。但有一点我很确定,ContentPresenter
即使你告诉他们也不会伸展,所以一定要先StackPanels
Grid
。{/ p>
更新(已修复)
好的,我挖掘了DataTemplate
的默认ControlTemplate
。结果是 使用DataGridColumnHeader
,所以我不认为这就是问题。
密钥可能是Grid
:
ContentPresenter
您可能只需要在<ContentPresenter
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" />
样式上设置HorizontalContentAlignment="Stretch"
。
答案 1 :(得分:3)
使用WPF 4 DataGrid但遇到同样的问题,只需在DataGridColumnHeader样式中设置HorizontalContentAlignment即可解决它(归功于上面建议的DanM)......
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Stretch" />
</Style>
答案 2 :(得分:0)
改为使用停靠面板
<DockPanel Background="LightYellow">
<TextBlock DockPanel.Dock="Left" Text="{Binding Name}" TextAlignment="Left" Background="LightGreen" />
<TextBlock DockPanel.Dock="Right" Text="{Binding Data}" HorizontalAlignment="Right" TextAlignment="Right" Background="LightBlue" />
</DockPanel >