WPF DataGrid:ColumnHeaderStyle ContentTemplate在调整大小之前不会显示全高

WPF DataGrid:ColumnHeaderStyle ContentTemplate在调整大小之前不会显示全高,wpf,datagrid,header,resize,toolkit,Wpf,Datagrid,Header,Resize,Toolkit,这可能是WPF工具包DataGrid中的错误 在我的Windows.Resources中,我定义了以下ColumnHeaderStyle: 其中输出是一个具有名称和数据字符串属性的简单类 我观察到的是,仅显示ContentTemplate的StackPanel中的Name属性first TextBlock控件。当我拖动其中一个列标题时,我会看到整个标题,包括数据文本块。只有手动调整其中一列的大小后,才能正确呈现列标题。有没有办法让列标题在代码中正确显示 更新:根据要求,这里是我的复制代码的其余部

这可能是WPF工具包DataGrid中的错误

在我的Windows.Resources中,我定义了以下ColumnHeaderStyle:

其中输出是一个具有名称和数据字符串属性的简单类

我观察到的是,仅显示ContentTemplate的StackPanel中的Name属性first TextBlock控件。当我拖动其中一个列标题时,我会看到整个标题,包括数据文本块。只有手动调整其中一列的大小后,才能正确呈现列标题。有没有办法让列标题在代码中正确显示

更新:根据要求,这里是我的复制代码的其余部分

public class Input
{
    public Input() 
    {
        Relationships = new ObservableCollection<Relationship>();
    }

    public string Name { get; set; }
    public string Data { get; set; }

    public ObservableCollection<Relationship> Relationships { get; set; }
}

public class Output
{
    public Output() { }

    public string Name { get; set; }
    public string Data { get; set; }
}

public class Relationship
{
    public Relationship() { }

    public string Formula { get; set; }
}
以下是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>
        <SolidColorBrush x:Key="RowHeaderIsMouseOverBrush" Color="Red" />
        <SolidColorBrush x:Key="RowBackgroundSelectedBrush" Color="Yellow" />
        <BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />

        <Style x:Key="RowHeaderGripperStyle" TargetType="{x:Type Thumb}">
            <Setter Property="Height" Value="2"/>
            <Setter Property="Background" Value="Green"/>
            <Setter Property="Cursor" Value="SizeNS"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Thumb}">
                        <Border Padding="{TemplateBinding Padding}"
                Background="{TemplateBinding Background}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding Name}" />
                            <TextBlock Text="{Binding Data}" />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <!-- from http://www.codeplex.com/wpf/WorkItem/View.aspx?WorkItemId=9193 -->
        <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>

        <DataTemplate x:Key="CellTemplate">
            <StackPanel>
                <TextBox Text="{Binding Formula, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="CellEditTemplate">
            <StackPanel>
                <TextBox Text="{Binding Formula, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>

    </Window.Resources>
    <Grid>
        <my:DataGrid Name="dg" 
                     ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"
                     RowHeaderStyle="{StaticResource RowHeaderStyle}"
                     HeadersVisibility="All" />
    </Grid>
</Window>
最后是隐藏的代码:

/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        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" };


        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" };

        i1.Relationships.Add(r1);
        i1.Relationships.Add(r2);
        i2.Relationships.Add(r3);
        i2.Relationships.Add(r4);


        CreateColumn(o1, 0);
        CreateColumn(o2, 1);
        CreateColumn(o3, 2);

        dg.Items.Add(i1);
        dg.Items.Add(i2);
        dg.ColumnWidth = DataGridLength.SizeToHeader;
    }

    private void CreateColumn(Output output, int index)
    {
        Binding textBinding = new Binding(string.Format("Relationships[{0}].Formula", index));
        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; }
}

当使用带有ColumnHeaderStyle={StaticResource ColumnHeaderStyle}的简单DataGrid并使用CreateColumn方法添加列时,我无法复制这一点:两个文本块立即在两个单独的行上显示良好

能否粘贴完整的DataGrid声明,以及它可能使用的任何其他样式


另外,您使用的wpftoolkit版本是什么?我使用6月份的版本和.NET 4 Beta 2中包含的DataGrid进行了测试。

如果列是在加载的事件处理程序中创建的,而不是在窗口的构造函数中创建的,则问题已得到修复。

Thx。我刚刚用我所有的代码更新了我的帖子。我正在使用codeplex的最新代码。
<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>
        <SolidColorBrush x:Key="RowHeaderIsMouseOverBrush" Color="Red" />
        <SolidColorBrush x:Key="RowBackgroundSelectedBrush" Color="Yellow" />
        <BooleanToVisibilityConverter x:Key="bool2VisibilityConverter" />

        <Style x:Key="RowHeaderGripperStyle" TargetType="{x:Type Thumb}">
            <Setter Property="Height" Value="2"/>
            <Setter Property="Background" Value="Green"/>
            <Setter Property="Cursor" Value="SizeNS"/>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Thumb}">
                        <Border Padding="{TemplateBinding Padding}"
                Background="{TemplateBinding Background}"/>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <Style x:Name="ColumnStyle" x:Key="ColumnHeaderStyle" TargetType="my:DataGridColumnHeader">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate>
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="{Binding Name}" />
                            <TextBlock Text="{Binding Data}" />
                        </StackPanel>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>

        <!-- from http://www.codeplex.com/wpf/WorkItem/View.aspx?WorkItemId=9193 -->
        <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>

        <DataTemplate x:Key="CellTemplate">
            <StackPanel>
                <TextBox Text="{Binding Formula, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>

        <DataTemplate x:Key="CellEditTemplate">
            <StackPanel>
                <TextBox Text="{Binding Formula, Mode=TwoWay}" />
            </StackPanel>
        </DataTemplate>

    </Window.Resources>
    <Grid>
        <my:DataGrid Name="dg" 
                     ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}"
                     RowHeaderStyle="{StaticResource RowHeaderStyle}"
                     HeadersVisibility="All" />
    </Grid>
</Window>
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
        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" };


        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" };

        i1.Relationships.Add(r1);
        i1.Relationships.Add(r2);
        i2.Relationships.Add(r3);
        i2.Relationships.Add(r4);


        CreateColumn(o1, 0);
        CreateColumn(o2, 1);
        CreateColumn(o3, 2);

        dg.Items.Add(i1);
        dg.Items.Add(i2);
        dg.ColumnWidth = DataGridLength.SizeToHeader;
    }

    private void CreateColumn(Output output, int index)
    {
        Binding textBinding = new Binding(string.Format("Relationships[{0}].Formula", index));
        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; }
}