首页 > 解决方案 > Windows 中的自定义边缘滑动事件(用于底部边缘)

问题描述

我想打开一个应用程序或通过底部滑动来做某事,那么我该怎么做才能获得该事件?是这样的:https ://www.microsoft.com/zh-cn/videoplayer/embed/fc016fcc-2bb1-4294-b236-343e1a533401?autoCaptions=en-us

我尝试在 UWP 应用程序中使用EdgeGesture类,它提供了StartingCompletedCanceled事件。但是当我在屏幕边缘滑动时,没有触发任何事件。

在 MainPage.xaml.cs 中:

public MainPage()
{
    this.InitializeComponent();

    //ApplicationView.GetForCurrentView().TryEnterFullScreenMode();

    EdgeGesture gesture = EdgeGesture.GetForCurrentView();

    gesture.Starting += Gesture_Starting;
    gesture.Completed += Gesture_Completed;
    gesture.Canceled += Gesture_Canceled;
}

private void Gesture_Canceled(EdgeGesture sender, EdgeGestureEventArgs args)
{
    throw new NotImplementedException();
}

private void Gesture_Completed(EdgeGesture sender, EdgeGestureEventArgs args)
{
    throw new NotImplementedException();
}

private void Gesture_Starting(EdgeGesture sender, EdgeGestureEventArgs args)
{
    throw new NotImplementedException();
}

不知道是不是我做错了,能帮帮我吗?还是有其他方法可以做到这一点?

标签: c#windowsuwp

解决方案


在桌面模式下,UWP 应用程序是一个窗口应用程序,难以捕获屏幕边缘滑动事件,并且EdgeGesture可能在平板电脑模式下工作。

为了适应不同情况的滑动需求,可以考虑使用GestureRecognizer.

这里我给大家一个简单的页面供大家参考。

<Page ...>
    <Grid Background="White">
    </Grid>
</Page>
private GestureRecognizer _GestureRecognizer;
PointerEventHandler PointerPressedEventHandler;
PointerEventHandler PointerMovedEventHandler;
PointerEventHandler PointerReleasedEventHandler;
PointerEventHandler PointerCanceledEventHandler;
private double startY = 0;
private double moveY = 0;

public GesturePage()
{
    this.InitializeComponent();
    _GestureRecognizer = new GestureRecognizer();
    _GestureRecognizer.GestureSettings = GestureSettings.ManipulationTranslateY;
    _GestureRecognizer.ManipulationStarted += _GestureRecognizer_ManipulationStarted;
    _GestureRecognizer.ManipulationUpdated += _GestureRecognizer_ManipulationUpdated;
    _GestureRecognizer.ManipulationCompleted += _GestureRecognizer_ManipulationCompleted;

    PointerPressedEventHandler = new PointerEventHandler(_PointerPressed);
    PointerMovedEventHandler = new PointerEventHandler(_PointerMoved);
    PointerReleasedEventHandler = new PointerEventHandler(_PointerReleased);
    PointerCanceledEventHandler = new PointerEventHandler(_PointerCanceled);

    this.AddHandler(UIElement.PointerPressedEvent, PointerPressedEventHandler, true);
    this.AddHandler(UIElement.PointerMovedEvent, PointerMovedEventHandler, true);
    this.AddHandler(UIElement.PointerReleasedEvent, PointerReleasedEventHandler, true);
    this.AddHandler(UIElement.PointerCanceledEvent, PointerCanceledEventHandler, true);
}
private void _GestureRecognizer_ManipulationStarted(GestureRecognizer sender, ManipulationStartedEventArgs args)
{
    startY = args.Position.Y;
}

private void _GestureRecognizer_ManipulationUpdated(GestureRecognizer sender, ManipulationUpdatedEventArgs args)
{
    moveY += Math.Abs(args.Delta.Translation.Y);
}

private void _GestureRecognizer_ManipulationCompleted(GestureRecognizer sender, ManipulationCompletedEventArgs args)
{
    if (moveY >= 50)
    {
        // Can be understood as sliding a distance
        if (startY <= 10)
        {
            // head to foot
        }
        else if (startY >= Window.Current.Bounds.Height - 10)
        {
            // foot to head
        }
        startY = 0;
        MoveY = 0;
    }
}
private void _PointerPressed(object sender, PointerRoutedEventArgs e)
{
    var pointer = e.GetCurrentPoint(this);
    _GestureRecognizer.ProcessDownEvent(pointer);
}

private void _PointerMoved(object sender, PointerRoutedEventArgs e)
{
    var pointers = e.GetIntermediatePoints(this);
   _GestureRecognizer.ProcessMoveEvents(pointers);
}

private void _PointerCanceled(object sender, PointerRoutedEventArgs e)
{
    var pointer = e.GetCurrentPoint(this);
    _GestureRecognizer.CompleteGesture();
}

private void _PointerReleased(object sender, PointerRoutedEventArgs e)
{
    var pointer = e.GetCurrentPoint(this);
    _GestureRecognizer.ProcessUpEvent(pointer);
}

手指、鼠标和笔Pointer在点击屏幕时会触发相关事件。上述代码的目的是捕获Pointer事件并将其传递给GestureRecognizer处理。

这是文件

此致。


推荐阅读