[英]Scrolling with touch not working in WPF
I have a WPF application and over a part of it I had a card which displayed Javascript. 我有一个WPF应用程序,在其中的一部分上,我有一张显示Javascript的卡。 My problem was that I wasn't able to scroll with the mouse over the Javascript card, because it was swallowing the events.
我的问题是我无法用鼠标滚动Javascript卡,因为它吞没了事件。 I solved that by hooking into the
PreviewMouseWheel
event (described here) sent by UIElement
: 我通过钩住
UIElement
发送的PreviewMouseWheel
事件(在此描述)解决了这个问题:
protected void AddListeners(BorderedCanvas borderedCanvas)
{
borderedCanvas.PreviewMouseWheel += PreviewMouseWheel;
}
protected void RemoveListeners(BorderedCanvas borderedCanvas)
{
borderedCanvas.PreviewMouseWheel -= PreviewMouseWheel;
}
protected static void PreviewMouseWheel(object sender, MouseWheelEventArgs e)
{
if (!e.Handled)
{
e.Handled = true;
var eventArg =
new MouseWheelEventArgs(e.MouseDevice, e.Timestamp, e.Delta)
{
RoutedEvent = UIElement.MouseWheelEvent,
Source = sender
};
var parent = VisualTreeHelper.GetParent((UIElement)sender) as UIElement;
parent?.RaiseEvent(eventArg);
}
}
Now, scrolling with the mouse works perfectly fine. 现在,使用鼠标滚动即可正常工作。
However, scrolling with touch doesn't work. 但是,触摸滚动不起作用。
So, I modified AddListeners
: 因此,我修改了
AddListeners
:
protected void AddListeners(BorderedCanvas borderedCanvas)
{
borderedCanvas.PreviewMouseWheel += PreviewMouseWheel;
borderedCanvas.PreviewTouchDown += new EventHandler<TouchEventArgs>(OnTouchDown);
borderedCanvas.PreviewTouchMove += new EventHandler<TouchEventArgs>(OnTouchMove);
}
And I added these methods: 我添加了以下方法:
protected static void OnTouchDown(object sender, TouchEventArgs e)
{
if (!e.Handled)
{
e.Handled = true;
var eventArg =
new TouchEventArgs(e.TouchDevice, e.Timestamp)
{
RoutedEvent = UIElement.TouchDownEvent,
Source = sender
};
var parent = VisualTreeHelper.GetParent((UIElement)sender) as UIElement;
parent?.RaiseEvent(eventArg);
}
}
protected static void OnTouchMove(object sender, TouchEventArgs e)
{
if (!e.Handled)
{
e.Handled = true;
var eventArg =
new TouchEventArgs(e.TouchDevice, e.Timestamp)
{
RoutedEvent = UIElement.TouchMoveEvent,
Source = sender
};
var parent = VisualTreeHelper.GetParent((UIElement)sender) as UIElement;
parent?.RaiseEvent(eventArg);
}
}
However, scrolling with touch still doesn't work. 但是,触摸滚动仍然不起作用。
Any idea what I did wrong? 知道我做错了什么吗?
To me it seems that I treated the mouse scroll and the touch scroll in a similar way, but the first works and the second doesn't. 对我来说,我似乎以类似的方式处理了鼠标滚动和触摸滚动,但是第一个有效而第二个无效。
You need to set the ScrollViewer.PanningMode for it to work with the touch. 您需要设置ScrollViewer.PanningMode使其能够与触摸一起使用。
<ScrollViewer PanningMode="Both"/>
The default value for the PanningMode is None. PanningMode的默认值为None。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.