【发布时间】:2018-06-12 07:28:54
【问题描述】:
我有一个 WPF 应用程序,其中有一部分我有一张显示 Javascript 的卡片。我的问题是我无法用鼠标在 Javascript 卡上滚动,因为它正在吞噬事件。我通过挂钩PreviewMouseWheel 发送的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);
}
}
现在,用鼠标滚动效果很好。
但是,触摸滚动不起作用。
所以,我修改了AddListeners:
protected void AddListeners(BorderedCanvas borderedCanvas)
{
borderedCanvas.PreviewMouseWheel += PreviewMouseWheel;
borderedCanvas.PreviewTouchDown += new EventHandler<TouchEventArgs>(OnTouchDown);
borderedCanvas.PreviewTouchMove += new EventHandler<TouchEventArgs>(OnTouchMove);
}
我添加了这些方法:
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);
}
}
但是,触摸滚动仍然不起作用。
知道我做错了什么吗?
对我来说,我似乎以类似的方式处理鼠标滚动和触摸滚动,但第一个有效,第二个无效。
【问题讨论】:
-
为什么要捕获这些事件并再次手动引发事件以进行家长控制。如果您不处理,事件将自动冒泡到父 UI 控件 (
e.handled = true)。 -
我尝试设置
e.handled = true,但在这种情况下滚动不起作用。因此,我将事件冒泡给父母,如此处所述 stackoverflow.com/questions/1585462/… 并且有效。