Xamarin中的Image TapGestureRecognizer未触发



在我的Xamarin应用程序中,我使用的是工具提示效果(本文后面(。

页面上有Help Icons,当我点击它时,工具提示就会出现,如果我点击Stacklayout区域的任何地方,它就会消失,这意味着它工作得很好。

有多个Help Icons,我希望如果我单击任何帮助图标,该帮助图标的工具提示只在打开的图标上出现和消失,因为现在,可以同时打开多个工具提示。

为此,我添加了一个TapGestureRecognizer,当有人单击帮助图标时,关闭打开的工具提示。但是,我不知道为什么TapGestureRecognizer甚至没有触发。

.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);
}
}
}

有多个帮助图标,我希望如果我点击任何帮助图标,该帮助图标的工具提示只会在打开的图标上出现和消失,因为现在,多个工具提示可以同时打开。

根据您的描述,您想在单击一个帮助图标时显示一个工具提示,然后单击以使工具提示消失吗?

您想使用TapGestureRecognizer来实现它,但您已经实现了调用click事件的TooltipEffect。这似乎是Xamarin的一个问题,更多细节可以在这里找到

但我看到这个例子已经实现了ITipListener,你可以点击工具提示使工具提示消失,不需要使用TapGestureRecognizer

class TipListener : Java.Lang.Object, ITipListener
{
public void OnTipDismissed(Android.Views.View p0, int p1, bool p2)
{

}
}

更新:

您已经在PlatformEffect中实现了xamarin.forms.view点击事件,它阻止了TapGestureRecognizer。找不到启动TapGestureRecognizer的方法,但我找到了一个变通方法,你可以看看。

可以使用LongClick使"工具提示"显示,也可以使用Click使工具提示消失。

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);
}

再次更新:

你可以看到我在OnAttached方法上添加了control.LongClick += OnTap;control.Click += HideTooltip;,它与你提供的文章LongPressedCommand相同,它的最终目标是添加长点击。

[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)
{

}
}
}
}
  1. 第一个测试是更改声明每个图像的XAML

effects:TooltipEffect.HasTooltip="False":

<Image Source="drawable/help.png"
...
effects:TooltipEffect.HasTooltip="False">

如果你这样做了,识别器工作吗?如果是这样,那么你已经成功了一半。

在每个图像的声明中都这样做。这应该是";禁用";所有工具提示。

2。使用TapGestureRecognizer打开一个(并关闭其他(。:

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);
}
}

相关内容

  • 没有找到相关文章

最新更新