.NET MAUI 11 поставляется со встроенным LongPressGestureRecognizer
.NET MAUI 11 Preview 3 добавляет LongPressGestureRecognizer как жест first-party, с duration, порогом движения, событиями state и command-binding, заменяя распространённый behavior из Community Toolkit.
До сих пор детектировать long press в .NET MAUI означало тянуться за сторонним behavior, TouchBehavior из Community Toolkit, или писать platform handlers по ОС. .NET MAUI 11 Preview 3 продвигает паттерн в first-party API с LongPressGestureRecognizer, приземляясь через dotnet/maui #33432.
Что вы получаете из коробки
Новый recognizer сидит рядом с TapGestureRecognizer, PanGestureRecognizer и остальной семьёй. Он выставляет четыре важных для реальных UI вещи:
MinimumPressDurationв миллисекундах, по умолчанию следующий конвенции платформы (около 500ms на Android, 400ms на iOS).MovementThresholdв device-independent единицах, отменяющий жест, если пользователь потянул дальше, так что scroll никогда не стрельнёт long press.- Событие
StateChanged, сообщающееStarted,Running,CompletedиCanceled, полезное для haptic feedback или визуальных pressed-состояний. CommandиCommandParameterдля MVVM-bindings, и событиеLongPressedдля простого code-behind.
Поскольку он висит на GestureRecognizers, любая View, уже принимающая жесты, подхватывает его без изменений handler.
Замена TouchBehavior в XAML
Контекстное меню на изображении аватара - канонический случай. В .NET MAUI 10 это обычно требовало TouchBehavior с LongPressCommand. В .NET MAUI 11 это сжимается до:
<Image Source="avatar.png"
HeightRequest="64"
WidthRequest="64">
<Image.GestureRecognizers>
<LongPressGestureRecognizer
MinimumPressDuration="650"
MovementThreshold="10"
Command="{Binding ShowContextMenuCommand}"
CommandParameter="{Binding .}" />
</Image.GestureRecognizers>
</Image>
Recognizer диспатчит на UI thread и пробрасывает привязанный параметр насквозь, так что view model остаётся platform-agnostic.
Реакция на state для press feedback
Событие StateChanged - то, что делает это похожим на нативное. Большинство платформенных long press анимируют scale или затемняют target во время удержания и чисто отменяются, если палец уплыл. С новым API эта логика живёт в одном месте:
var longPress = new LongPressGestureRecognizer
{
MinimumPressDuration = 500
};
longPress.StateChanged += async (s, e) =>
{
switch (e.State)
{
case GestureRecognizerState.Started:
await card.ScaleTo(0.97, 80);
break;
case GestureRecognizerState.Completed:
await HapticFeedback.Default.PerformAsync(HapticFeedbackType.LongPress);
await card.ScaleTo(1.0, 80);
ShowMenu();
break;
case GestureRecognizerState.Canceled:
await card.ScaleTo(1.0, 80);
break;
}
};
card.GestureRecognizers.Add(longPress);
Это одно событие заменяет три platform handlers и Behavior, завязанный в MauiProgram.
Почему это важно для авторов библиотек
Библиотеки контролов, которые раньше поставляли собственную инфраструктуру long-press, теперь могут опираться на общий контракт. Recognizer Microsoft.Maui.Controls означает, что bindings, input transparency и пропагация IsEnabled уже работают так же, как работает остальной framework, так что потребители перестают биться о несогласованности вроде срабатывания жеста во время scroll в CollectionView или несоблюдения InputTransparent="True" на родителе.
Если вы всё ещё на TouchBehavior из Community Toolkit, миграция обычно - однострочный swap и переименование property. Смотрите полные release notes MAUI для Preview 3 на предмет сопутствующих изменений жестов и XAML.