代码之家  ›  专栏  ›  技术社区  ›  funwithcoding

Silverlight3 datagrid:如何添加滚轮支持?

  •  2
  • funwithcoding  · 技术社区  · 14 年前

    Silverlight3工具箱中的Datagrid没有响应滚轮(鼠标滚轮)。有没有办法得到滚轮的支撑?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Henrik Söderlund    14 年前

    下面是我使用的行为。下面是如何在xaml中将其附加到datagrid。

    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>
    
        2
  •  0
  •   Pieter Nijs    14 年前

    另一种方法(非常基本的示例):
    xaml:

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



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

    所以,我在这里做的很简单!
    DataGrid MouseWheel -事件。在那个处理程序中我检索 e.Delta ScrollIntoView -方法,在这里我可以指定网格应该滚动到哪一行。
    如前所述,这是一个非常基本的例子!这只是为了向你展示它是如何工作的!你应该增加额外的逻辑,以确保你不会失去活力!