2012-11-14 32 views
6

Tôi có một DataGrid đầy đủ các ghi chú và có thể một ghi chú sẽ cao hơn chiều cao của DataGrid. Khi điều này xảy ra, nếu bạn cố gắng và cuộn xuống để đọc nửa dưới của ghi chú, DataGrid ngay lập tức bỏ qua hàng tiếp theo.Làm cách nào để có được một DataGrid để cuộn trơn tru khi Hàng cao hơn Khung nhìn?

Điều này không chỉ ngăn người dùng xem ghi chú đầy đủ mà còn khiến cho việc cuộn cảm thấy bị thay đổi vì nó dường như nhảy xung quanh.

Có cách nào để yêu cầu WPF di chuyển trơn tru qua một ghi chú dài mà không vô hiệu hóa ảo hóa DataGrid mặc định?

+0

Không thể bạn quấn lưu ý trong một 'ScrollViewer' mà' MaxHeight' được thiết lập để chiều cao của DataGrid? – McGarnagle

+1

@dbaseman Tôi muốn tiêu đề luôn hiển thị và điều đó sẽ vô hiệu hóa ảo hóa của DataGrid vì nó sẽ hiển thị tất cả các mục – Rachel

+0

Bạn đã thử đặt 'CanContentScroll' thành' False' cho ScrollViewer của dataGrid chưa? –

Trả lời

19

Tôi tin rằng bạn đang tìm kiếm thuộc tính đính kèm VirtualizingPanel.ScrollUnit mà bạn có thể đặt trên DataGrid.

Nếu bạn đặt giá trị của nó thành Pixel thay vì mặc định Item, nó sẽ làm những gì bạn muốn.

+3

Điều đó sẽ làm điều đó Nếu @Rachel sử dụng .NET 4.5 – Sisyphe

+0

Tôi rất tiếc khi sử dụng .Net 4.0, tuy nhiên không quá muộn để tôi nâng cấp phiên bản .Net framework mà tôi đang sử dụng, vì vậy tôi sẽ xem xét thực hiện nếu không tìm thấy giải pháp dễ dàng nào khác. Cảm ơn bạn. – Rachel

2

Nếu bạn không muốn nâng cấp lên .NET 4.5, bạn vẫn có thể đặt thuộc tính IsPixelBased trên VirtualizingStackPanel cơ bản. Tuy nhiên tài sản này là nội bộ trong .NET 4.0, vì vậy bạn sẽ phải làm điều đó thông qua sự phản ánh.

public static class VirtualizingStackPanelBehaviors 
{ 
    public static bool GetIsPixelBasedScrolling(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(IsPixelBasedScrollingProperty); 
    } 

    public static void SetIsPixelBasedScrolling(DependencyObject obj, bool value) 
    { 
     obj.SetValue(IsPixelBasedScrollingProperty, value); 
    } 

    // Using a DependencyProperty as the backing store for IsPixelBasedScrolling. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty IsPixelBasedScrollingProperty = 
     DependencyProperty.RegisterAttached("IsPixelBasedScrolling", typeof(bool), typeof(VirtualizingStackPanelBehaviors), new UIPropertyMetadata(false, OnIsPixelBasedScrollingChanged)); 

    private static void OnIsPixelBasedScrollingChanged(DependencyObject o, DependencyPropertyChangedEventArgs e) 
    { 
     var virtualizingStackPanel = o as VirtualizingStackPanel; 
     if (virtualizingStackPanel == null) 
      throw new InvalidOperationException(); 

     var isPixelBasedPropertyInfo = typeof(VirtualizingStackPanel).GetProperty("IsPixelBased", BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.NonPublic); 
     if (isPixelBasedPropertyInfo == null) 
      throw new InvalidOperationException(); 

     isPixelBasedPropertyInfo.SetValue(virtualizingStackPanel, (bool)(e.NewValue), null); 
    } 
} 

Và trong XAML của bạn:

<DataGrid> 
    <DataGrid.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel IsItemsHost="True" local:VirtualizingStackPanelBehaviors.IsPixelBasedScrolling="True" /> 
     </ItemsPanelTemplate> 
    </DataGrid.ItemsPanel> 
</DataGrid> 
Các vấn đề liên quan