2013-05-06 18 views
5

Biểu đồ dữ liệu WPF rất đơn giản được liên kết với danh sách hình ảnh. Khi thay đổi kích thước các cột bằng cách sử dụng dải phân cách (hoặc chính cửa sổ chính), CPU chuyển sang 100% và ứng dụng nhập vòng lặp vô hạn sắp xếp/thay đổi kích thước dẫn đến nội dung cửa sổ nhảy qua lại và không có thao tác nhập nào được xử lý (bị khóa).Làm thế nào tôi có thể làm việc xung quanh biện pháp vô hạn dữ liệu WPF này/sắp xếp lỗi?

Các DataGrid được định nghĩa là:

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

Những điều tôi đã cố gắng:

  • Thừa hưởng DataGrid và trọng Sắp xếp/Đo cho lưới điện.
  • Ghi đè sắp xếp/đo lường cho cửa sổ.
  • Tinh chỉnh thanh cuộn lưới, tắt chúng và các tùy chọn khác nhau.

Những gì tôi không thể làm:

  • Nâng cấp lên Net 4.5 không phải là một lựa chọn trong dự án này.
  • Xóa các cột, sau đó sẽ không có điểm nào trong lưới.

Có cách nào xung quanh hành vi này trong .Net 4.0 không? Nếu không, tôi sẽ phải xem xét một cách giải quyết khác như sử dụng một cái gì đó khác thay cho lưới điện mặc dù tôi đã dành lứa tuổi tạo kiểu tóc và sẽ ghét mất công việc đó.

Cảm ơn trước

Trả lời

1

Tôi đang đối mặt với cùng một vấn đề và cuối cùng tôi đã tìm được cách giải quyết sau hàng giờ gặp khó khăn.

Thêm một event handler cho sự kiện SizeChanged trong DataGrid:

<DataGrid SizeChanged="DataGrid_SizeChanged"> 

Và đây là quy tắc ứng xử lý sự kiện:

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

Tôi không biết nếu điều này là một tốt giải pháp, nhưng đây là điều duy nhất làm việc cho tôi.

0

Như mọi khi, trong các hành vi hỏi tôi đã kiểm tra một cái gì đó ra một lần nữa và bây giờ tôi có một cách giải quyết có thể sử dụng.

Thay đổi DataGrid để luôn hiển thị thanh cuộn của nó, như bên dưới.

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

Tôi đang đối mặt với cùng một vấn đề với bạn. Thật không may, giải pháp này không làm việc cho tôi. –

Các vấn đề liên quan