代码之家  ›  专栏  ›  技术社区  ›  Philipp Schmid

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

  •  1
  • Philipp Schmid  · 技术社区  · 15 年前

    这可能是WPF工具包中的一个bug DataGrid .

    在我的windows.resources中,我定义了以下内容 ColumnHeaderStyle :

    <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>
    

    因为我的列是动态生成的,所以我在代码中定义列:

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

    在哪里? Output 是一个简单的类 Name Data (字符串)属性。

    我观察到的是 仅名称属性 (首先) TextBlock 控制在 ContentTemplate StackPanel ) 如图所示 .当我拖动其中一个列标题时,会看到整个标题(包括数据 控件 )只有 手动调整其中一列的大小后,列标题将正确呈现 .有没有办法让列标题在代码中正确显示?

    更新: 根据要求,这是我的剩余代码。

    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; }
    }
    
    2 回复  |  直到 13 年前
        1
  •  0
  •   Jeremy    15 年前

    当将简单的DataGrid与ColumnHeaderStyle=“StaticResource ColumnHeaderStyle”一起使用,并使用CreateColumn方法添加列时,我无法复制此内容:两个文本块都立即显示为“精细”(在两个单独的行上)。

    您可以粘贴完整的数据报声明和它可能使用的任何其他样式吗?

    另外,您使用的wpftoolkit是什么版本?我用6月份的版本和包含在.NET4测试版2中的数据报进行了测试。

        2
  •  0
  •   Philipp Schmid    15 年前

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