在我的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)
{
}
}
}
}
- 第一个测试是更改声明每个图像的
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);
}
}