2010-11-02 20 views
13

Yakın bir zamanda bir WPF (C/4.0) DataGrid içinde çalışan bir metin kaydırma işlemi yapmaya çalışıyorum ve hangi çözümü uyguladığım önemli değil (Tümü, bir şablonun içindeki bir TextBlock biçimi). Kılavuzun otomatik yüksekliği ve ızgaranın alt kısmında aşırı beyaz boşluk (Görünürlük uğruna Sarı olarak ayarla) ile sonuçlanır.WPF DataGrid AutoSize Sayı

Benim Kod: (Yorumlananlar kod metin kaydırma alternatif çözüm, ama yine de aşırı uzayda sonuçlanır)

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

cevap

0

Evet, ben de bir hata olması gerektiğini karşılaştık. Sorun, gerçekten Sarma işleminin kendisi değil, bir hücrenin daha kısa bir sürede küçülmesinden sonra, DataGrid Yüksekliği ne sebepten ötürü yeniden boyutlandırılana kadar (Pencere boyutu ne olursa olsun) güncellenmeyecektir. Bu sorun için iyi bir çözümüm yok, ama burada bir çeşit çözüm var. DataGridColumn Onun yerine TextBlocks kullanarak

Güncelleme

Optimize versiyonu. Sarma Sütunları bilmek için Ekli Özellik WrapColumn (varsayılan olarak false) kullanır.

Xaml. Yerel olarak ekle: MainWindow.WrapColumn = Her kaydırma Sütunu için "Doğru".

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

ActualWidth gerçek

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

Bu çözüm çalışır ayarlı WrapColumn olan her DataGridColumn için değiştirir için bir dinleyici ekleyin Ekli Mülkiyet

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

ekle, ancak otomatik boyutu Bir akış belgesiyle yazdırırken hala kafam karışır. Akış belgesi bir yeniden boyutlandırmayı tetikliyorsa, yüksekliği doğru şekilde görüntülenir, ancak tüm sütunlar daraltılır. –

+0

Onayladığınızı gördüm ve bir süre sonra onaylanmadı, bu yüzden bir şeyin top çalmadığını düşündüm. Yani sütunlar minimum genişlikte mi sonuçlanıyor ya da etkisi nedir? –

+0

Oldukça fazla, temelde ızgarayı alıp sonra yazdırdığım bir akış belgesine koyuyorum. Esas olarak, akış belgesi bir sayfayı geçtiği anda, üzerindeki ilk datagridin dağılmasıdır. (Genel ızgara doğru genişliktedir ve bu yüzden başlıklar vardır, ancak ayak parmakları sola doğru daraltılmıştır. Bir ekran görüntüsünü denemek ve göndermek istiyorum. –

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.