【问题标题】:Image TapGestureRecognizer not triggering in Xamarin图像 TapGestureRecognizer 未在 Xamarin 中触发
【发布时间】:2021-09-18 17:00:12
【问题描述】:

在我的 Xamarin 应用程序中,我正在使用工具提示效果(关注此 article)。

页面上有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);
        }
    }
}

【问题讨论】:

  • 工具提示 xaml 是如何工作的?如果它是具有透明背景的模态框,则您的识别器位于活动页面后面,因此无法正常工作。
  • 如你所见,它们都可以同时出现在屏幕上,我只希望一个工具提示出现在屏幕上,另一个必须消失。
  • 啊,好吧,我没有测试这个,只是查看了代码,但我认为如果你在 TooltipEffect 类中更改 OnHasTooltipChanged 方法,你也许可以将其存档。在`view.Effects.Add(new ControlTooltipEffect())`之前检查现有的,然后view.Effects.Remove(existing);
  • 我不确定,但也许 TooltipEffect “消耗”了水龙头,所以 TapGestureRecognizer 看不到它。如果设置effects:TooltipEffect.HasTooltip="False",识别器会触发吗?如果是这样,那么就这样做,并在识别器中,以某种方式将 HasTooltip 设置为 True。

标签: c# .net xamarin xamarin.forms


【解决方案1】:

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

根据您的描述,您想让一个ToolTip在您单击一个帮助图标时出现,然后单击使ToolTip消失?

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

但是我看到示例有实现ITipListener,你可以点击ToolTip使ToolTip消失,不需要使用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 使 ToolTip 出现,并使用 Click 使 ToolTip 消失。

 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一样,它的最终目的是添加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)
        {
         
        }
    }
}
 }

【讨论】:

  • 你好,这段代码已经写在我的项目中了..
  • 是的,我希望如果有人点击帮助图标,它会打开该图标的工具提示并消失/关闭打开的图标..
  • @Stavrogin 链接错误,请见this picture,长按打开工具提示,点击关闭工具提示。
  • @Stavrogin 我做了一个关于ToolTip的简单示例,你可以通过this link下载
  • @Stavrogin 我只为三个按钮删除了三个Clicked="TooltipClicked",然后它工作正常,你可以看看这个gif:github.com/CherryBu/gif/blob/master/17.gif
【解决方案2】:
  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);
    }
}

【讨论】:

  • 当我设置TooltipEffect.HasTooltip="False"时,很遗憾识别器不起作用。
  • 如果您删除所有effects:TooltipEffect... XAML,识别器是否成功调用Handle_tapped? (使用断点或调试写入行进行测试)。如果它仍然不起作用,那么它与 TooltipEffect 无关 - 绑定可能没有正确设置。添加以质疑设置BindingContext 的XAML 或CS 代码。
  • 我真的很抱歉我的坏事.. 现在,绑定正在工作。当我设置TooltipEffect.HasTooltip="False"时,可以调用Handle_Tapped。但是我粘贴了您的代码,并且工具提示停止出现(即使对于图像,TooltipEffect.HasTooltip="True".
  • 现在识别器开始工作,但我在Handle_Tapped() 中替换了你的代码,并且工具提示没有出现..知道为什么吗?
  • @Stavrogin - 不幸的是我的代码不是一个完整的解决方案。设置 HasTooltip 后,我忘了触发水龙头。可能需要更改 TooltipEffect 源代码,以公开 OnTap 方法,以便此代码可以调用它。我认为文章中的那个依赖于一个用java编写的工具提示库,也许可以搜索一个不同的,它都是用Xamarin编写的。
猜你喜欢
  • 1970-01-01
  • 2017-11-12
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
相关资源
最近更新 更多