2013-05-06 19 views
5

Bardzo prosty datagrid WPF związany z listą obrazów. Podczas zmiany rozmiaru kolumn za pomocą dzielnika (lub samego okna głównego) procesor przechodzi do 100%, a aplikacja wchodzi w nieskończoną pętlę aranżacji/zmiany rozmiaru, co powoduje przeskakiwanie zawartości okna i brak obsługi danych wejściowych użytkownika (zablokowane).Jak mogę obejść ten datagrid WPF nieskończonej miary/aranżować błąd?

DataGrid jest zdefiniowany jako:

<DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Image 1" Width="40*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Image Source="{Binding ImagePath}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTextColumn Header="EmptyText" /> 
     </DataGrid.Columns> 
    </DataGrid> 

Czego próbowałem:

  • Dziedziczenie DataGrid i przesłanianie Wykonam/Miarka za siatki.
  • Zastępowanie aranżacji/miary okna.
  • Poprawianie pasków przewijania siatki, wyłączanie i różne opcje.

Co nie mogę zrobić:

  • Upgrade do .NET 4.5 nie jest rozwiązaniem w tym projekcie.
  • Usunąć kolumny, wtedy nie byłoby żadnego punktu w siatce.

Czy jest jakiś sposób obejścia tego zachowania w .Net 4.0? Jeśli nie, będę musiał rozważyć obejście takie jak użycie czegoś innego zamiast siatki, chociaż spędziłem całe wieki na stylizacji i nie chciałbym stracić tej pracy.

góry dzięki

Odpowiedz

1

byłem stoi ten sam problem, a ja w końcu znalazłem obejście po godzinach zmagań.

Dodaj procedurę obsługi zdarzenia do zdarzenia SizeChanged w DataGrid:

<DataGrid SizeChanged="DataGrid_SizeChanged"> 

I to jest kod obsługi zdarzenia:

private void DataGrid_SizeChanged(object a_sender, SizeChangedEventArgs a_args) 
{ 
    try 
    { 
     DataGrid dataGrid = a_sender as DataGrid; 
     if (dataGrid != null) 
     { 
      double widthDifference = Math.Abs(a_args.PreviousSize.Width - a_args.NewSize.Width); 
      double heightDifference = Math.Abs(a_args.PreviousSize.Height - a_args.NewSize.Height); 

      if ((widthDifference != 0 && widthDifference < 1) || (heightDifference != 0 && heightDifference < 1)) 
      { 
       dataGrid.Measure(new Size(Math.Round(dataGrid.ActualWidth), Math.Round(dataGrid.ActualHeight))); 
       dataGrid.InvalidateMeasure(); 
      } 
     } 
    } 
    catch (Exception) { } 
} 

ja nie wiem, czy to jest dobre rozwiązanie, ale to jedyna rzecz, która zadziałała dla mnie.

0

jak zawsze, w akcie prosząc sprawdziłem coś znowu i teraz mam użytkowej obejścia.

Zmień datagrid, tak aby zawsze widoczne były paski przewijania, jak pokazano poniżej.

 <DataGrid ItemsSource="{Binding ImageList}" AutoGenerateColumns="False" x:Name="ImageGrid" ScrollViewer.HorizontalScrollBarVisibility="Visible" ScrollViewer.VerticalScrollBarVisibility="Visible"> 
+0

Mam do czynienia z tym samym problemem niż ty. Niestety, to rozwiązanie nie działa dla mnie. –