Swipe to reveal details

In this example we are implementing a really cool card navigation with a "swipe to reveal details" action. Design by Leo Leung.

Icons are from Google's excellent Material Icons and nature images from UnSplash.

The swipe gesture

Each card has a SwipeGesture with the Direction property set to Up. This means that one has to swipe upwards in order to activate the gesture.

<SwipeGesture ux:Name="swipe" Direction="Up" Type="Active" />

Setting the Type property to Active means that this gesture works like a switch, which stays on until swiped back down.

We use a SwipingAnimation to declare what should happen while the user is swiping. The Source property points on the SwipeGesture we want to animate in response to.

<SwipingAnimation Source="swipe">
    <Move Target="topPanel" Y="-0.3" RelativeTo="Size" Duration="0.5" />
    <Change bottomPanelScaling.X="1" Duration="0.5" />
    <Change bottomPanelScaling.Y="1" Duration="0.5" />
    <Change bottomPanel.Opacity="1" Duration="0.5" />
</SwipingAnimation>

Each card has two layers, the "topPanel" and the "bottomPanel". As we swipe upwards, the "topPanel" is moved in the negative Y direction, while the "bottomPanel" is scaled.

The navigation

The navigation between cards is a PageControl with two of its default properties overriden. We set InactiveState="Unchanged" so that inactive pages are not hidden. We set Transition="None" because our cards have their own transitions specified.

<PageControl InactiveState="Unchanged" Transition="None">
	<NavigationMotion GotoEasing="QuadraticOut" GotoDuration="0.3" />

We use EnteringAnimation and ExitingAnimation to animate the cards as they are navigated to and from. Since we need to show the edges of the next cards, we add some Scale to the triggers.

<EnteringAnimation Scale="0.5">
    <Move X="-1.4" RelativeTo="ParentSize" Duration="0.5" />
</EnteringAnimation>
<ExitingAnimation Scale="0.5">
    <Move X="1.4" RelativeTo="ParentSize" Duration="0.5" />
</ExitingAnimation>

The inactive cards, should lose some opacity and also scale down slightly. This is done inside an ActivatingAnimation trigger.

<ActivatingAnimation>
    <Change self.Opacity="1" Duration="0.5" />
    <Change pageScaling.Factor="1" Duration="0.5" />
</ActivatingAnimation>