Я бы хотел включить удержание клавиши SHIFT на клавиатуре при прокрутке, чтобы прокрутить ScrollViewer
по горизонтали.
Я узнал от здесь , что событие PointerWheelChanged
- это то, что яищуОбработка этого, однако, не работает, потому что ScrollViewer
обрабатывает его внутренне, поэтому мой обработчик никогда не вызывается.Чтобы обойти это, я использовал метод AddHandler
, как описано в статье «Обзор маршрутизируемых событий» .
Это работает ... но, похоже, работает мой код ПОСЛЕScrollViewer
запускает свой внутренний код.В результате содержимое ScrollViewer
перемещается по вертикали, а затем по горизонтали.Похоже, что они происходят в таком порядке, и установка e.Handled = true
не останавливает его.
Есть ли способ «перехватить» свиток, чтобы я мог обработать его со своей собственной логикой, таким образом позволяя ScrollViewer
панорамирование по горизонтали, если нажата клавиша SHIFT?Недавно я задал похожий вопрос (включая перехват ввода в элемент управления, чтобы я мог обработать его с помощью своей собственной логики) здесь , где ответ включал обработку другого события, когда это событие имело место до запуска управляющего элементасобственная логика.Я не вижу аналогичного события «pre stuff происходящее» для прокрутки указателя.
У меня следующий код.Обратите внимание, что ScrollViewer
может прокручивать ОБА по горизонтали и вертикали, а также масштабировать:
<!-- Contained in Grid in a UserControl, if that's relevant -->
<ScrollViewer Name="MyCanvasScrollViewer"
VerticalScrollBarVisibility="Auto"
HorizontalScrollBarVisibility="Auto"
ZoomMode="Enabled"
ZoomSnapPointsType="Optional"
PointerWheelChanged="MyCanvasScrollViewer_PointerWheelChanged">
<!-- Content to pan -->
</ScrollViewer>
Код-позади:
// Constructor for the user contol.
public MyControl()
{
// Add the scroll wheel event handler and force it to run.
this.MyCanvasScrollViewer.AddHandler(ScrollViewer.PointerWheelChangedEvent, new PointerEventHandler(this.MyCanvasScrollViewer_PointerWheelChanged), true);
// Other un-related stuff omitted here...
}
// Event handler for the Pointer Wheel Changed event.
private void MyCanvasScrollViewer_PointerWheelChanged(object sender, PointerRoutedEventArgs e)
{
// If SHIFT is pressed...
var keyState = CoreWindow.GetForCurrentThread().GetKeyState(VirtualKey.Shift);
if ((keyState & CoreVirtualKeyStates.Down) == CoreVirtualKeyStates.Down)
{
// Get the amount to scroll.
PointerPoint pointer = e.GetCurrentPoint(this.WallCanvasScrollViewer);
double scrollWheelDelta = pointer.Properties.MouseWheelDelta;
// Change the view in the scroll viewer.
this.MyCanvasScrollViewer.ChangeView(scrollWheelDelta, null, null, true);
// Mark event as handled.
e.Handled = true;
}
}