App ScreenShopt Я пытаюсь обнаружить события нажатия и отпускания, когда пользователь нажимает на ярлык в приложении, чтобы реализовать жест длительного нажатия.
Я уже создал класс LongPressbehaviorиз другого вопроса StackOverflow, но к ярлыкам не прикреплено событие печати и выпущенного события.Я могу использовать кнопку, но мне все еще нужен отформатированный текст (FormattedString), в котором есть URL-ссылки, по которым пользователи могут переходить на веб-сайт.
C #
public class LongPressBehavior : BehaviorBase<ExtendedLabel>
{
private readonly object _syncObject = new object();
private const int Duration = 1000;
//timer to track long press
private Timer _timer;
//the timeout value for long press
private readonly int _duration;
//whether the button was released after press
private volatile bool _isReleased;
/// <summary>
/// Occurs when the associated button is long pressed.
/// </summary>
public event EventHandler LongPressed;
public static readonly BindableProperty CommandProperty = BindableProperty.Create(nameof(Command),
typeof(ICommand), typeof(LongPressBehavior), default(ICommand));
public static readonly BindableProperty CommandParameterProperty =
BindableProperty.Create(nameof(CommandParameter), typeof(object), typeof(LongPressBehavior));
/// <summary>
/// Gets or sets the command parameter.
/// </summary>
public object CommandParameter
{
get => GetValue(CommandParameterProperty);
set => SetValue(CommandParameterProperty, value);
}
/// <summary>
/// Gets or sets the command.
/// </summary>
public ICommand Command
{
get => (ICommand)GetValue(CommandProperty);
set => SetValue(CommandProperty, value);
}
protected override void OnAttachedTo(ExtendedLabel button)
{
base.OnAttachedTo(button);
this.BindingContext = button.BindingContext;
button.Clicked += Button_Pressed;
//button.Released += Button_Released;
}
protected override void OnDetachingFrom(ExtendedLabel button)
{
base.OnDetachingFrom(button);
this.BindingContext = null;
button.Clicked -= Button_Pressed;
//button.Released -= Button_Released;
}
/// <summary>
/// DeInitializes and disposes the timer.
/// </summary>
private void DeInitializeTimer()
{
lock (_syncObject)
{
if (_timer == null)
{
return;
}
_timer.Change(Timeout.Infinite, Timeout.Infinite);
_timer.Dispose();
_timer = null;
Debug.WriteLine("Timer disposed...");
}
}
/// <summary>
/// Initializes the timer.
/// </summary>
private void InitializeTimer()
{
lock (_syncObject)
{
_timer = new Timer(Timer_Elapsed, null, _duration, Timeout.Infinite);
}
}
private void Button_Pressed(object sender, EventArgs e)
{
Debug.WriteLine("Pressed");
_isReleased = false;
InitializeTimer();
}
private void Button_Released(object sender, EventArgs e)
{
Debug.WriteLine("Released");
_isReleased = true;
DeInitializeTimer();
}
protected virtual void OnLongPressed()
{
var handler = LongPressed;
handler?.Invoke(this, EventArgs.Empty);
if (Command != null && Command.CanExecute(CommandParameter))
{
Command.Execute(CommandParameter);
}
}
public LongPressBehavior()
{
_isReleased = true;
_duration = Duration;
}
public LongPressBehavior(int duration) : this()
{
_duration = duration;
}
private void Timer_Elapsed(object state)
{
DeInitializeTimer();
if (_isReleased)
{
return;
}
Device.BeginInvokeOnMainThread(OnLongPressed);
}
}
public class ExtendedLabel : Label
{
private event EventHandler Pressed;
private event EventHandler Released;
public string Name
{
get; set;
}
public void DoClick()
{
Pressed.Invoke(this, null);
}
public event EventHandler Clicked
{
add
{
lock (this)
{
Pressed += value;
TapGestureRecognizer g = new TapGestureRecognizer();
g.Tapped += (s, e) => Pressed?.Invoke(s, e);
GestureRecognizers.Add(g);
}
}
remove
{
lock (this)
{
Pressed -= value;
GestureRecognizers.Clear();
}
}
}
public event EventHandler UnClicked
{
add
{
lock (this)
{
Released += value;
TapGestureRecognizer g = new TapGestureRecognizer();
g.Tapped += (s, e) => Released?.Invoke(s, e);
GestureRecognizers.Add(g);
}
}
remove
{
lock (this)
{
Released -= value;
GestureRecognizers.Clear();
}
}
}
}
XAML
<controls:ExtendedLabel HorizontalOptions="Fill" HorizontalTextAlignment="End" TextColor="White" FormattedText="{Binding OutFormattedBody}">
<controls:ExtendedLabel.Behaviors>
<behaviors:LongPressBehavior LongPressed="OnClick"/>
</controls:ExtendedLabel.Behaviors>
</controls:ExtendedLabel>
Я хочу иметь возможность нажать и удерживать около секунды на метке, чтобы вызвать событие LongPressно по-прежнему можно одним нажатием на ссылки, которые могут быть в FormattedString.