2010-02-16 2 views
2

Набор инструментов Datagrid в silverlight 3 не отвечает на колесо прокрутки (колесико для мыши). Есть ли способ получить поддержку колесика прокрутки?Silverlight 3 datagrid: Как добавить поддержку прокрутки?

+0

Я попытался обернуть datagrid в scrollviewer. Поддержка поддержки колесика мыши, но заголовки данных не фиксированы. :(. Похоже, это не очень хорошая идея. – funwithcoding

+0

Можем ли мы добавить поддержку колесика мышью с использованием поведения? – funwithcoding

ответ

3

Ниже приводится поведение, которое я использую. И ниже, как вы прикрепляете его к datagrid в xaml.

using System; 
using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 
using System.Windows.Automation.Peers; 
using System.Windows.Interactivity; 
using System.Windows.Automation.Provider; 
using System.Windows.Automation; 
using System.Windows.Data; 

namespace GLS.Gui.Helper.Behaviors 
{ 
    public class MouseWheelScrollBehavior : Behavior<Control> 
    { 
     /// <summary> 
     /// Gets or sets the peer. 
     /// </summary> 
     /// <value>The peer.</value> 
     private AutomationPeer Peer { get; set; } 

     /// <summary> 
     /// Called after the behavior is attached to an AssociatedObject. 
     /// </summary> 
     /// <remarks>Override this to hook up functionality to the AssociatedObject.</remarks> 
     protected override void OnAttached() 
     { 
      this.Peer = FrameworkElementAutomationPeer.FromElement(this.AssociatedObject); 

      if (this.Peer == null) 
       this.Peer = FrameworkElementAutomationPeer.CreatePeerForElement(this.AssociatedObject); 

      this.AssociatedObject.MouseWheel += new MouseWheelEventHandler(AssociatedObject_MouseWheel); 
      base.OnAttached(); 
     } 

     /// <summary> 
     /// Called when the behavior is being detached from its AssociatedObject, but before it has actually occurred. 
     /// </summary> 
     /// <remarks>Override this to unhook functionality from the AssociatedObject.</remarks> 
     protected override void OnDetaching() 
     { 
      this.AssociatedObject.MouseWheel -= new MouseWheelEventHandler(AssociatedObject_MouseWheel); 
      base.OnDetaching(); 
     } 

     /// <summary> 
     /// Handles the MouseWheel event of the AssociatedObject control. 
     /// </summary> 
     /// <param name="sender">The source of the event.</param> 
     /// <param name="e">The <see cref="System.Windows.Input.MouseWheelEventArgs"/> instance containing the event data.</param> 
     void AssociatedObject_MouseWheel(object sender, MouseWheelEventArgs e) 
     { 
      //Do not handle already handled events 
      if (e.Handled) 
       return; 

      this.AssociatedObject.Focus(); 

      int direction = Math.Sign(e.Delta); 

      ScrollAmount scrollAmount = 
       (direction < 0) ? ScrollAmount.SmallIncrement : ScrollAmount.SmallDecrement; 

      if (this.Peer != null) 
      { 
       IScrollProvider scrollProvider = 
        this.Peer.GetPattern(PatternInterface.Scroll) as IScrollProvider; 

       bool shiftKey = (Keyboard.Modifiers & ModifierKeys.Shift) == ModifierKeys.Shift; 

       if (scrollProvider != null && scrollProvider.VerticallyScrollable && !shiftKey) 
       { 
        scrollProvider.Scroll(ScrollAmount.NoAmount, scrollAmount); 
        e.Handled = true; 
       } 
       else if (scrollProvider != null && scrollProvider.VerticallyScrollable && shiftKey) 
       { 
        scrollProvider.Scroll(scrollAmount, ScrollAmount.NoAmount); 
        e.Handled = true; 
       } 


      } 
     } 
    } 


} 

Как прикрепить поведение:

<data:DataGrid> 
      <i:Interaction.Behaviors> 
       <b:MouseWheelScrollBehavior /> 
      </i:Interaction.Behaviors> 
     </data:DataGrid> 
+0

Претензии к Андреа Бощину, который написал это: http://silverlightplayground.boschin.it/post/2009/07/10/Silverlight-30 -RTW-An-universal-MouseWheelScrolling-behavior.aspx –

0

другой способ сделать это (очень простой пример):
XAML:

<Grid x:Name="LayoutRoot"> 
    <data:DataGrid x:Name="dg" Height="100"> 
     <ScrollViewer.VerticalScrollBarVisibility>true</ScrollViewer.VerticalScrollBarVisibility> 
    </data:DataGrid> 


CS:

public partial class MainPage : UserControl 
{ 
    IList<Person> list = new List<Person>(); 
    public MainPage() 
    { 
     InitializeComponent(); 
     list.Add(new Person("Pieter1","Nijs")); 
     list.Add(new Person("Pieter2", "Nijs")); 
     list.Add(new Person("Pieter3", "Nijs")); 
     list.Add(new Person("Pieter4", "Nijs")); 
     list.Add(new Person("Pieter5", "Nijs")); 
     list.Add(new Person("Pieter6", "Nijs")); 
     list.Add(new Person("Pieter7", "Nijs")); 
     list.Add(new Person("Pieter8", "Nijs")); 
     dg.ItemsSource = list; 
     dg.MouseWheel += new MouseWheelEventHandler(dg_MouseWheel); 
    } 

    void dg_MouseWheel(object sender, MouseWheelEventArgs e) 
    { 
     if (e.Delta < 0) 
     { 
      dg.ScrollIntoView(list[dg.SelectedIndex + 2], null); 
     } 
     else 
     { 
      dg.ScrollIntoView(list[dg.SelectedIndex - 2], null); 
     } 
    } 
} 

Итак, что я делаю здесь довольно просто!
Я добавляю EventHandler к событию DataGrid MouseWheel. В этом обработчике я возвращаю e.Delta (это величина, с которой колесо изменилось с последнего раза), поэтому я знаю, просканировал ли пользователь (положительная Delta) или вниз (отрицательная Delta). И затем я вызываю метод ScrollIntoView DataGrid, где я могу указать, в какую строку должен прокручиваться Grid.
Как уже упоминалось, это очень простой пример! Это просто показать вам, как это может сработать! Вы должны добавить дополнительную логику, чтобы убедиться, что вы не выходите из отскока!

+0

Любая идея, как сделать прокрутку 2 пальцев в серебряном свете 4 для моей сетки данных –