Реализуем Sliding Panel с использованием Xamarin.Forms & MAUI
Привет, в этом посте я продемонстрирую, как вы можете создать Sliding Panel в своем Xamarin.Forms приложении.
Для этого примера было создано 4 варианта скользящих панелей (Sliding Panel):
На следующем рисунке показано, как были названы панели и значки, используемые в этом примере.
PageUp
Создайте AbsoluteLayout
, который появится при загрузке страницы и StackLayout
, называемый «PageUp», который будет панелью, которая будет скользить сверху вниз.
Обратите внимание, что для оконки открытия/закрытия определены
GestureRecognizers
.
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DemoSlidingPanel"
x:Class="DemoSlidingPanel.MainPage">
<AbsoluteLayout
x:Name="Page"
VerticalOptions="FillAndExpand" >
<StackLayout
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
BackgroundColor="White">
<Image
Source="DownBlue.png"
HorizontalOptions="CenterAndExpand"
VerticalOptions="StartAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="DownBlue_Tapped" />
<PanGestureRecognizer PanUpdated="DownBlue_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
<StackLayout
x:Name="PageUp"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
Orientation="Vertical"
VerticalOptions="FillAndExpand"
Spacing="0">
<StackLayout
VerticalOptions="FillAndExpand"
BackgroundColor="#006df0">
<Image
Source="UpWhite.png"
HorizontalOptions="CenterAndExpand"
VerticalOptions="EndAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="UpWhite_Tapped" />
<PanGestureRecognizer PanUpdated="UpWhite_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
</StackLayout>
</AbsoluteLayout>
</ContentPage>
Код
При инициализации страницы присвойте -1000
свойству TranslationY
, ранее созданной панели. Это позволит отобразить эту страницу первой. Создайте методы UpWhite_Tapped
и DownBlue_Tapped
, которые будут вызываться при захвате GestureRecognizers
.
PageUp.TranslateTo
будет использоваться для выполнения группового перехода. Введите 0
для координаты x
и y
для отображения панели, а -Page.Height
в координате y
, чтобы скрыть панель.
Easing.SinIn
- эффект, используемый для перехода.
using System;
using System.Text;
using Xamarin.Forms;
namespace DemoSlidingPanel
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
PageUp.TranslationY = -1000;
}
async void UpWhite_Tapped(object sender, EventArgs e)
{
await PageUp.TranslateTo(0, -Page.Height, 500, Easing.SinIn);
}
async void DownBlue_Tapped(object sender, EventArgs e)
{
await PageUp.TranslateTo(0, 0, 500, Easing.SinIn);
}
}
}
PageRight
Создайте AbsoluteLayout
, который появится при загрузке страницы и StackLayout
с именем «PageRight», который будет панелью, которая будет перемещаться справа налево.
Обратите внимание, что для оконки открытия/закрытия определены
GestureRecognizers
.
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DemoSlidingPanel"
x:Class="DemoSlidingPanel.MainPage">
<AbsoluteLayout
x:Name="Page"
VerticalOptions="FillAndExpand">
<StackLayout
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
BackgroundColor="White">
<Image
Source="LeftBlue.png"
HorizontalOptions="EndAndExpand"
VerticalOptions="CenterAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="LeftBlue_Tapped" />
<PanGestureRecognizer PanUpdated="LeftBlue_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
<StackLayout
x:Name="PageRight"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
Orientation="Vertical"
VerticalOptions="FillAndExpand"
Spacing="0">
<StackLayout
VerticalOptions="FillAndExpand"
BackgroundColor="#006df0">
<Image
Source="RightWhite.png"
HorizontalOptions="StartAndExpand"
VerticalOptions="CenterAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="RightWhite_Tapped" />
<PanGestureRecognizer PanUpdated="RightWhite_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
</StackLayout>
</AbsoluteLayout>
</ContentPage>
Код
При инициализации страницы назначьте 1000
свойству TranslationX
ранее созданной панели. Это позволит отобразить эту страницу первой. Создайте методы LeftBlue_Tapped
и RightWhite_Tapped
, которые будут вызваны при захвате GestureRecognizers
.
PageRight.TranslateTo
будет служить для выполнения группового перехода. Введите 0
в координатах x
и y
, чтобы отобразить панель и Page.Width
в координате x
, чтобы скрыть панель.
Easing.SinIn
- эффект, используемый для перехода.
using System;
using System.Text;
using Xamarin.Forms;
namespace DemoSlidingPanel
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
PageRight.TranslationX = 1000;
}
async void LeftBlue_Tapped(object sender, EventArgs e)
{
await PageRight.TranslateTo(0, 0, 500, Easing.SinIn);
}
async void RightWhite_Tapped(object sender, EventArgs e)
{
await PageRight.TranslateTo(Page.Width, 0, 500, Easing.SinIn);
}
}
}
PageDown
Создайте AbsoluteLayout
, который появится при загрузке страницы, и StackLayout
с именем «PageDown», который будет панелью, которая будет скользить снизу вверх.
Обратите внимание, что для оконки открытия/закрытия определены
GestureRecognizers
.
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DemoSlidingPanel"
x:Class="DemoSlidingPanel.MainPage">
<AbsoluteLayout
x:Name="Page"
VerticalOptions="FillAndExpand">
<StackLayout
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
BackgroundColor="White">
<Image
Source="UpBlue.png"
HorizontalOptions="CenterAndExpand"
VerticalOptions="EndAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="UpBlue_Tapped" />
<PanGestureRecognizer PanUpdated="UpBlue_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
<StackLayout
x:Name="PageDown"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
Orientation="Vertical"
VerticalOptions="FillAndExpand"
Spacing="0">
<StackLayout
VerticalOptions="FillAndExpand"
BackgroundColor="#006df0">
<Image
Source="DownWhite.png"
HorizontalOptions="CenterAndExpand"
VerticalOptions="StartAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="DownWhite_Tapped" />
<PanGestureRecognizer PanUpdated="DownWhite_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
</StackLayout>
</AbsoluteLayout>
</ContentPage>
Код
При инициализации страницы назначьте 1000
для свойства TranslationY
ранее созданной панели. Это позволит отобразить эту страницу первой. Создайте методы UpBlue_Tapped
и DownWhite_Tapped
, которые будут вызваны при захвате GestureRecognizers
.
PageDown.TranslateTo
будет служить для выполнения группового перехода. Введите 0
в координатах x
и y
, чтобы отобразить панель и Page.Height
в координате y
, чтобы скрыть панель.
Easing.SinIn
- эффект, используемый для перехода.
using System;
using System.Text;
using Xamarin.Forms;
namespace DemoSlidingPanel
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
PageDown.TranslationY = 1000;
}
async void UpBlue_Tapped(object sender, EventArgs e)
{
await PageDown.TranslateTo(0, 0, 500, Easing.SinIn);
}
async void DownWhite_Tapped(object sender, EventArgs e)
{
await PageDown.TranslateTo(0, Page.Height, 500, Easing.SinIn);
}
}
}
PageLeft
Создайте AbsoluteLayout
, который появится при загрузке страницы, и StackLayout
, называемый «PageLeft», который будет панелью, которая будет скользить снизу вверх.
Обратите внимание, что для оконки открытия/закрытия определены
GestureRecognizers
.
XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage
xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:DemoSlidingPanel"
x:Class="DemoSlidingPanel.MainPage">
<AbsoluteLayout
x:Name="Page"
VerticalOptions="FillAndExpand">
<StackLayout
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
BackgroundColor="White">
<Image
Source="LeftBlue.png"
HorizontalOptions="EndAndExpand"
VerticalOptions="CenterAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="LeftBlue_Tapped" />
<PanGestureRecognizer PanUpdated="LeftBlue_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
<StackLayout
x:Name="PageLeft"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="All"
Orientation="Vertical"
VerticalOptions="FillAndExpand"
Spacing="0">
<StackLayout
VerticalOptions="FillAndExpand"
BackgroundColor="#006df0">
<Image
Source="LeftWhite.png"
HorizontalOptions="EndAndExpand"
VerticalOptions="CenterAndExpand">
<Image.GestureRecognizers>
<TapGestureRecognizer Tapped="LeftWhite_Tapped" />
<PanGestureRecognizer PanUpdated="LeftWhite_Tapped" />
</Image.GestureRecognizers>
</Image>
</StackLayout>
</StackLayout>
</AbsoluteLayout>
</ContentPage>
Код
При инициализации страницы присвойте -1000
свойству TranslationX
ранее созданной панели. Это позволит отобразить эту страницу первой. Создайте методы LeftWhite_Tapped
и RightBlue_Tapped
, которые будут вызываться при захвате GestureRecognizers
.
PageLeft.TranslateTo
будет использоваться для выполнения группового перехода. Введите 0
в координатах x
и y
для отображения панели и -Page.Width
в координате x
, чтобы скрыть панель.
Easing.SinIn
- эффект, используемый для перехода.
using System;
using System.Text;
using Xamarin.Forms;
namespace DemoSlidingPanel
{
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
PageLeft.TranslationX = -1000;
}
async void LeftWhite_Tapped(object sender, EventArgs e)
{
await PageLeft.TranslateTo(-Page.Width, 0, 500, Easing.SinIn);
}
async void RightBlue_Tapped(object sender, EventArgs e)
{
await PageLeft.TranslateTo(0, 0, 500, Easing.SinIn);
}
}
}
Результат
Исходный код доступен на Github.
Теги: mobile, xamarin forms, MAUI, перевод