En mi aplicación Xamarin, estoy usando Tooltips Effects (siguió este artículo ).
Hay Help Icons en la página, cuando hago clic en él, aparece la información sobre herramientas y si hago clic en cualquier parte del área de Stacklayout, desaparece, lo que significa que funciona perfectamente.
Hay múltiples Help Icons , y quiero que si hago clic en cualquier ícono de ayuda, la información sobre herramientas para este ícono de ayuda solo aparezca y desaparezca los abiertos, porque ahora, se pueden abrir varias sugerencias al mismo tiempo.
Para esto, agrego un TapGestureRecognizer , que cuando alguien hace clic en el ícono de ayuda, cierra la información sobre herramientas abierta. Pero no sé por qué TapGestureRecognizer ni siquiera se activa.
.xaml
<StackLayout x:Name="mainstacklayout"> <StackLayout.GestureRecognizers> <TapGestureRecognizer Tapped="Handle_Tapped" NumberOfTapsRequired="1" /> </StackLayout.GestureRecognizers> // Code <Image Source="drawable/help.png" WidthRequest="20" HeightRequest="20" effects:TooltipEffect.Position="Left" effects:TooltipEffect.BackgroundColor="#222222" effects:TooltipEffect.TextColor="#FFFFFF" effects:TooltipEffect.Text="Tooltip" effects:TooltipEffect.HasTooltip="True"> <Image.GestureRecognizers> <TapGestureRecognizer Tapped="Handle_Tapped" NumberOfTapsRequired="1" /> </Image.GestureRecognizers> </Image> // Code </StackLayout>.xaml.cs
public void Handle_Tapped(object sender, EventArgs args) { foreach (var c in mainstacklayout.Children) { if (TooltipEffect.GetHasTooltip(c)) { TooltipEffect.SetHasTooltip(c, false); TooltipEffect.SetHasTooltip(c, true); } } }Hay múltiples íconos de ayuda, y quiero que si hago clic en cualquier ícono de ayuda, la información sobre herramientas para este ícono de ayuda solo aparezca y desaparezca los abiertos, porque ahora, se pueden abrir varias sugerencias al mismo tiempo.
De acuerdo con su descripción, ¿desea que aparezca una información sobre herramientas cuando haga clic en un icono de ayuda y luego haga clic para que desaparezca la información sobre herramientas?
Desea usar TapGestureRecognizer para lograrlo, pero ya implementó TooltipEffect ese evento de clic de llamada. Parece un problema en Xamarin, se pueden encontrar más detalles aquí
Pero veo que la muestra ha implementado ITipListener , puede hacer clic en ToolTip para hacer que ToolTip desaparezca, no es necesario usar TapGestureRecognizer
class TipListener : Java.Lang.Object, ITipListener { public void OnTipDismissed(Android.Views.View p0, int p1, bool p2) { } }Actualizar:
Ha implementado el evento de clic xamarin.forms.view en PlatformEffect, bloquea TapGestureRecognizer. No puedo encontrar la forma de activar TapGestureRecognizer, pero encontré una solución alternativa que puede echar un vistazo.
Puede usar LongClick para hacer que aparezca ToolTip y usar Click para hacer que ToolTip desaparezca.
protected override void OnAttached() { var control = Control ?? Container; control.LongClick += OnTap; control.Click += HideTooltip; } private void HideTooltip(object sender, EventArgs e) { var control = Control ?? Container; _toolTipsManager.FindAndDismiss(control); } protected override void OnDetached() { var control = Control ?? Container; control.LongClick -= OnTap; control.Click -= OnTap; _toolTipsManager.FindAndDismiss(control); }Actualizar de nuevo:
Puedes ver que he agregado control.LongClick += OnTap; y control.Click += HideTooltip; en el método OnAttached, es lo mismo que LongPressedCommand , el artículo que proporcionó, su objetivo final es agregar longclick.
[assembly: ResolutionGroupName("CrossGeeks")] [assembly: ExportEffect(typeof(DroidTooltipEffect), nameof(TooltipEffect))] namespace ToolTipSample.Droid.Effects { public class DroidTooltipEffect : PlatformEffect { ToolTip toolTipView; ToolTipsManager _toolTipsManager; ITipListener listener; public DroidTooltipEffect() { listener = new TipListener(); _toolTipsManager = new ToolTipsManager(listener); } void OnTap(object sender, EventArgs e) { var control = Control ?? Container; var text = TooltipEffect.GetText(Element); if (!string.IsNullOrEmpty(text)) { ToolTip.Builder builder; var parentContent = control.RootView; var position = TooltipEffect.GetPosition(Element); switch (position) { case TooltipPosition.Top: builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionAbove); break; case TooltipPosition.Left: builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionLeftTo); break; case TooltipPosition.Right: builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionRightTo); break; default: builder = new ToolTip.Builder(control.Context, control, parentContent as ViewGroup, text.PadRight(80, ' '), ToolTip.PositionBelow); break; } builder.SetAlign(ToolTip.AlignLeft); builder.SetBackgroundColor(TooltipEffect.GetBackgroundColor(Element).ToAndroid()); builder.SetTextColor(TooltipEffect.GetTextColor(Element).ToAndroid()); toolTipView = builder.Build(); _toolTipsManager?.Show(toolTipView); } } protected override void OnAttached() { var control = Control ?? Container; control.LongClick += OnTap; control.Click += HideTooltip; } private void HideTooltip(object sender, EventArgs e) { var control = Control ?? Container; _toolTipsManager.FindAndDismiss(control); } protected override void OnDetached() { var control = Control ?? Container; control.LongClick -= OnTap; control.Click -= OnTap; _toolTipsManager.FindAndDismiss(control); } class TipListener : Java.Lang.Object, ITipListener { public void OnTipDismissed(Android.Views.View p0, int p1, bool p2) { } } } }XAML donde declaras cada imagen, a effects:TooltipEffect.HasTooltip="False" :
<Image Source="drawable/help.png" ... effects:TooltipEffect.HasTooltip="False">Si es así, ¿funciona el reconocedor? Si es así, entonces estás a mitad de camino.
Haz eso en la declaración de cada imagen. Esto debería "deshabilitar" toda la información sobre herramientas.
2. Utilice TapGestureRecognizer para activar uno (y desactivar los demás):
public void Handle_Tapped(object sender, EventArgs args) { foreach (var c in mainstacklayout.Children) { // Turn off any that are on. if (TooltipEffect.GetHasTooltip(c)) { TooltipEffect.SetHasTooltip(c, false); } } // Turn on the desired tooltip. if (sender is View activeView) { TooltipEffect.SetHasTooltip(activeView, true); // TODO: TooltipEffect source needs this method added; // it has to find the effect for activeView, and call its `OnTap` method. //TODO TooltipEffect.OnTap(activeView); } }