SHIFT + Прокрутка для горизонтальной прокрутки в ScrollViewer UWP - PullRequest
0 голосов
/ 14 декабря 2018

Я бы хотел включить удержание клавиши 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;
    }
}

1 Ответ

0 голосов
/ 14 декабря 2018

Вы можете просто отключить VerticalScrollMode в shift keydown и включить его при keyup .Нет необходимости в pointerwheelchanged сама.Он прекрасно работает.

Xaml

<ScrollViewer ZoomMode="Enabled" x:Name="MyScrollViewer"  HorizontalScrollMode="Enabled" HorizontalScrollBarVisibility="Visible" >
   <Image Height="600" Width="500" Source="/Assets/1.jpg"></Image>
</ScrollViewer>

// C # код

public sealed partial class MainPage : Page
{
    public MainPage()
    {
        this.InitializeComponent();
        CoreWindow.GetForCurrentThread().KeyDown += MainPage_KeyDown;
        CoreWindow.GetForCurrentThread().KeyUp += MainPage_KeyUp; ;
    }

    private void MainPage_KeyUp(CoreWindow sender, KeyEventArgs args)
    {
        if (args.VirtualKey == VirtualKey.Shift)
        {                
            MyScrollViewer.IsScrollInertiaEnabled = true;
            MyScrollViewer.VerticalScrollMode = ScrollMode.Enabled;
        }
    }

    private void MainPage_KeyDown(CoreWindow sender, KeyEventArgs args)
    {
        if (args.VirtualKey == VirtualKey.Shift)
        {
            MyScrollViewer.IsScrollInertiaEnabled = false;
            MyScrollViewer.VerticalScrollMode = ScrollMode.Disabled;
        }
    }

}
...