silverlight 3 工具包中的 Datagrid 没有响应滚轮(鼠标滚轮)。有没有办法获得滚轮的支持?
问问题
1283 次
2 回答
3
以下是我正在使用的行为。下面是如何将它附加到 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>
于 2010-02-16T14:51:24.317 回答
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
(这是自上次以来轮子的变化量),所以我知道用户是向上滚动(正增量)还是向下滚动(负增量)。然后我调用ScrollIntoView
DataGrid 的 - 方法,在这里我可以指定 Grid 应该滚动到哪一行。
如前所述,这是一个非常基本的示例!这只是向您展示它是如何工作的!您应该添加额外的逻辑以确保您不会跳出弹跳!
于 2010-02-16T15:08:54.100 回答