2010-11-02 4 views
13

Я недавно пытался получить текстовую оболочку, работающую в среде DataGrid WPF (C/4.0), и независимо от того, какое решение я реализую (все используют некоторую форму TextBlock внутри шаблона с упаковкой), он смущает авто высота сетки и приводит к избыточному пустому пространству (установите значение Желтый для видимости) в нижней части сетки.Ошибка в AutoSize WPF DataGrid

Мой код: (комментируемые код альтернативное решение для переноса текста, но по-прежнему приводит к чрезмерному пространстве)

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 
    <DataGrid Grid.Row="0" AutoGenerateColumns="False" ColumnWidth="*" Name="dgFamilyHistories" IsReadOnly="True" 
          HorizontalScrollBarVisibility="Disabled" 
         ItemsSource="{Binding Path=Patient.FamilyHistories}" RowDetailsVisibilityMode="Visible" 
         GridLinesVisibility="All"> 
     <DataGrid.Resources> 
      <Style TargetType="{x:Type DataGridRow}"> 
       <Setter Property="Height" Value="Auto"/> 
      </Style> 
      <!--<Style TargetType="{x:Type DataGridCell}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type DataGridCell}"> 
          <Border Name="border"> 
           <ContentControl Content="{TemplateBinding Content}"> 
            <ContentControl.ContentTemplate> 
             <DataTemplate> 
              <DockPanel> 
               <TextBlock TextWrapping="WrapWithOverflow" TextTrimming="CharacterEllipsis" 
                 Width="Auto" Height="Auto" Text="{Binding Text}"/> 
              </DockPanel> 
             </DataTemplate> 
            </ContentControl.ContentTemplate> 
           </ContentControl> 
          </Border> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style>--> 
     </DataGrid.Resources> 
     <DataGrid.Background> 
      <SolidColorBrush Color="Yellow" /> 
     </DataGrid.Background> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="Date" Binding="{Binding DateEntered, StringFormat={}{0:dd/MM/yyyy}}" Width="85"/> 
      <!--<DataGridTextColumn Header="Relation" Binding="{Binding Relation}"/>--> 
      <DataGridTemplateColumn Header="Relation"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=Relation}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <!--<DataGridTextColumn Header="Illness" Binding="{Binding Illness}"/>--> 
      <DataGridTemplateColumn Header="Illness"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=Illness}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <!--<DataGridTextColumn Header="Health" Binding="{Binding Health}"/>--> 
      <DataGridTemplateColumn Header="Health"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=Health}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Birth Date" Binding="{Binding DateOfBirth, StringFormat={}{0:dd/MM/yyyy}}" Width="85"/> 
      <DataGridTextColumn Header="Death Date" Binding="{Binding DateOfDeath, StringFormat={}{0:dd/MM/yyyy}}" Width="85"/> 
      <!--<DataGridTextColumn Header="Death Cause" Binding="{Binding CauseOfDeath}"/>--> 
      <DataGridTemplateColumn Header="Death Cause"> 
         <DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock TextTrimming="CharacterEllipsis" TextWrapping="Wrap" Text="{Binding Path=CauseOfDeath}"/> 
          </DataTemplate> 
         </DataGridTemplateColumn.CellTemplate> 
        </DataGridTemplateColumn> 
      <DataGridTextColumn Header="Age" Binding="{Binding Age}" Width="50"/> 
     </DataGrid.Columns> 
     <DataGrid.RowDetailsTemplate> 
      <DataTemplate> 
       <Label Name="lblDetails" Content="{Binding Path=Comments}" ContentStringFormat="{}Comments: {0}" Margin="15,0,0,0"/> 
       <DataTemplate.Triggers> 
        <DataTrigger Binding="{Binding Path=Comments, Converter={Converters:IsNullStringConverter}}" Value="True"> 
         <Setter TargetName="lblDetails" Property="Visibility" Value="Collapsed"/> 
        </DataTrigger> 
       </DataTemplate.Triggers> 
      </DataTemplate> 
     </DataGrid.RowDetailsTemplate> 
    </DataGrid> 
    <DockPanel Grid.Row="1" Background="Blue"> 

    </DockPanel> 
</Grid> 

ответ

0

Да, я столкнулся, что тоже должна быть ошибка. Проблема на самом деле не сама упаковка, а скорее, что, как только ячейка станет меньше, чем она была, тогда высота DataGrid не будет обновляться до тех пор, пока она не изменится по какой-либо причине (измените размер окна или что-то еще). У меня нет хорошего решения этой проблемы, но вот что-то вроде обходного пути.

Update

Оптимизированная версия, используя DataGridColumn вместо текстовых блоков. Использует привязанную свойство WrapColumn (по умолчанию false), чтобы знать обтекаемые столбцы.

Xaml. Добавить local: MainWindow.WrapColumn = "True" для каждой оберточной колонки.

<DataGridTemplateColumn Header="Health" 
         local:MainWindow.WrapColumn="True"> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock TextTrimming="CharacterEllipsis" 
         TextWrapping="Wrap" 
         Text="{Binding Path=Health}"/> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
</DataGridTemplateColumn> 

Добавить вложенное свойство

public partial class MainWindow : Window 
{ 
    private static readonly DependencyProperty WrapColumnProperty = 
      DependencyProperty.RegisterAttached("WrapColumn", 
               typeof(bool), 
               typeof(MainWindow)); 
    public static void SetWrapColumn(DependencyObject element, bool value) 
    { 
     element.SetValue(WrapColumnProperty, value); 
    } 
    public static bool GetWrapColumn(DependencyObject element) 
    { 
     return (bool)element.GetValue(WrapColumnProperty); 
    } 

Добавить прослушиватель ActualWidth изменения для каждого DataGridColumn что WrapColumn набор истинной

public MainWindow() 
{ 
    InitializeComponent(); 

    DependencyPropertyDescriptor dependencyPropertyDescriptor = 
     DependencyPropertyDescriptor.FromProperty(DataGridColumn.ActualWidthProperty, typeof(DataGridColumn)); 

    if (dependencyPropertyDescriptor != null) 
    { 
     foreach (DataGridColumn column in c_dataGrid.Columns) 
     { 
      if (GetWrapColumn(column) == true) 
      { 
       dependencyPropertyDescriptor.AddValueChanged(column, DataGridColumn_ActualWidthChanged); 
      } 
     } 
    } 

    void DataGridColumn_ActualWidthChanged(object sender, EventArgs e) 
    { 
     c_dataGrid.Width = c_dataGrid.ActualWidth - 1; 
     EventHandler eventHandler = null; 
     eventHandler = new EventHandler(delegate 
     { 
      c_dataGrid.Width = double.NaN; 
      c_dataGrid.LayoutUpdated -= eventHandler; 
     }); 
     c_dataGrid.LayoutUpdated += eventHandler; 
    } 
    //... 
} 
+0

Это решение работает, но авто размер все еще запутывается при печати документом потока. Если документ потока инициирует изменение размера, его высота отображается правильно, но все столбцы сжимаются. –

+0

Пила, которую вы одобрили, и отклонил ее некоторое время после того, как я понял, что что-то не играет в мяч. Итак, столбцы заканчиваются минимальной шириной или каков эффект? –

+0

в значительной степени, basiclly Я беру сетку и помещаю ее в поток документа, который я тогда печатаю. По существу, происходит то, что, как только документ потока превышает одну страницу, первый datagrid на нем становится испорченным. (Общая сетка - это правильная ширина, так же как и заголовки, но все пальцы на ногах все скручены влево. Я попытаюсь опубликовать снимок экрана. –

1
Use this way, to expand your datagrid with proper height and width 
    <my:DataGridTemplateColumn Header="{DynamicResource name}" Width="*" 
                  CanUserSort="True" SortMemberPath="Name" 
                  HeaderStyle="{StaticResource StaffDgColoumnHeaderStyle}"> 
           <my:DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <TextBlock Style="{StaticResource RowTextblockStyle}" >`enter code here` 
               <Hyperlink> 
                <TextBlock Text="{Binding Path=Name}" ToolTip="{Binding Name}" 
                   TextWrapping="NoWrap" TextTrimming="CharacterEllipsis"/> 
               </Hyperlink> 
              </TextBlock> 
            </DataTemplate> 
           </my:DataGridTemplateColumn.CellTemplate> 
          </my:DataGridTemplateColumn> 

          <my:DataGridTemplateColumn Header="{DynamicResource sft}" Width="*" 
                  CanUserSort="True" SortMemberPath="ShiftName" 
                  HeaderStyle="{StaticResource StaffDgColoumnHeaderStyle}"> 
           <my:DataGridTemplateColumn.CellTemplate> 
            <DataTemplate> 
             <TextBlock Text="{Binding ShiftName}" ToolTip="{Binding ShiftName}" 
                 Style="{StaticResource RowTextblockStyle}"/> 
            </DataTemplate> 
           </my:DataGridTemplateColumn.CellTemplate> 
          </my:DataGridTemplateColumn> 

See Width ="*" Or Use Width ="Auto" or Width = "20*" as per as your requirement.