.Maui 识别点击手势

[删除(380066935@qq.com或微信通知)]

更好的阅读体验请查看原文:https://learn.microsoft.com/zh-cn/dotnet/maui/fundamentals/gestures/tap?view=net-maui-7.0

.NET 多平台应用 UI (.NET MAUI) 点击手势识别器用于点击检测,并与 类一起 TapGestureRecognizer 实现。 此类定义了以下属性:

  • Command,属于 类型 ICommand,在识别点击时执行。
  • CommandParameter,属于 object 类型,是传递给 Command 的参数。
  • NumberOfTapsRequired,类型 int为 ,表示识别点击手势所需的点击数。 此属性的默认值为 1。
  • Buttons,属于 类型 ButtonsMask,用于定义主要或辅助鼠标按钮或两者是否在 Mac Catalyst 和 Windows 上触发手势。 有关详细信息,请参阅 定义按钮掩码
  • Command,属于 类型 ICommand,在识别点击时执行。
  • CommandParameter,属于 object 类型,是传递给 Command 的参数。
  • NumberOfTapsRequired,类型 int为 ,表示识别点击手势所需的点击数。 此属性的默认值为 1。

这些属性由 BindableProperty 对象提供支持;也就是说,它们可以作为数据绑定的目标,并能进行样式设置。

TapGestureRecognizer 还定义在 Tapped 识别点击时引发的事件。 TappedEventArgs事件附带Tapped的对象定义 类型的Parameter属性,该属性object指示属性CommandParameter传递的值(如果已定义)。

TapGestureRecognizer 还定义在 Tapped 识别点击时引发的事件。 TappedEventArgs事件附带Tapped的对象定义 类型的Parameter属性,该属性object指示属性CommandParameter传递的值(如果已定义)。 对象 TappedEventArgs 还定义 属性 ButtonsGetPosition 方法。 属性 Buttons 的类型为 ButtonsMask,可用于确定主鼠标按钮还是辅助鼠标按钮触发了 Mac Catalyst 和 Windows 上的手势识别器。 方法 GetPosition 返回一个 Point? 对象,该对象表示检测到点击手势的位置。 有关按钮掩码的详细信息,请参阅 定义按钮掩码。 有关 方法的详细信息 GetPosition ,请参阅 获取手势位置

警告

TapGestureRecognizer在 Windows 上无法识别多次双击。

创建 TapGestureRecognizer

若要使 识别 View 点击手势,请创建 对象 TapGestureRecognizer ,处理 Tapped 事件,并将新的手势识别器添加到视图上的 GestureRecognizers 集合。 下面的代码示例演示 TapGestureRecognizer 附加到 的 Image

<Image Source="dotnet_bot.png">
    <Image.GestureRecognizers>
        <TapGestureRecognizer Tapped="OnTapGestureRecognizerTapped"
                              NumberOfTapsRequired="2" />
  </Image.GestureRecognizers>
</Image>

事件处理程序的代码 OnTapGestureRecognizerTapped 应添加到代码隐藏文件中:

void OnTapGestureRecognizerTapped(object sender, TappedEventArgs args)
{
    // Handle the tap
}

等效 C# 代码如下:

TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer();
tapGestureRecognizer.Tapped += (s, e) =>
{
    // Handle the tap
};
Image image = new Image();
image.GestureRecognizers.Add(tapGestureRecognizer);

默认情况下, Image 将响应单次点击。 当 属性 NumberOfTapsRequired 设置为大于 1 时,仅当点击发生在设定的时间段内时,才会执行事件处理程序。 如果第二个 (或后续) 的点击在该时间段内未发生,则实际上会忽略它们。

定义按钮掩码

TapGestureRecognizer对象具有Buttons类型的 ButtonsMask属性,该属性定义主鼠标按钮或辅助鼠标按钮或两者是否在 Mac Catalyst 和 Windows 上触发手势。 ButtonsMask 枚举定义下列成员:

  • Primary 表示鼠标主按钮,通常为鼠标左键。
  • Secondary 表示辅助鼠标按钮,通常为鼠标右键。

以下示例显示了一个 , TapGestureRecognizer 它使用鼠标辅助按钮检测点击:

<Image Source="dotnet_bot.png">
    <Image.GestureRecognizers>
        <TapGestureRecognizer Tapped="OnTapGestureRecognizerTapped"
                              Buttons="Secondary" />
  </Image.GestureRecognizers>
</Image>

事件的事件处理程序 Tapped 可以确定哪个按钮触发了手势:

void OnTapGestureRecognizerTapped(object sender, TappedEventArgs args)
{
    // Handle the tap
    if (args.Buttons == ButtonsMask.Secondary)
    {
        // Do something
    }
}

等效 C# 代码如下:

TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer
{
    Buttons = ButtonsMask.Secondary
};
tapGestureRecognizer.Tapped += (s, e) =>
{
    // Handle the tap
    if (args.Buttons == ButtonsMask.Secondary)
    {
        // Do something
    }
};
Image image = new Image();
image.GestureRecognizers.Add(tapGestureRecognizer);

警告

在 Windows 上, TapGestureRecognizer 当属性大于 1 时,将 属性设置为 ButtonsSecondary 的 不会遵循 NumberOfTapsRequired 该属性。

此外,还可以定义 , TapGestureRecognizer 以便主要或辅助鼠标按钮触发手势:

<TapGestureRecognizer Tapped="OnTapGestureRecognizerTapped"
                      Buttons="Primary,Secondary" />

等效 C# 代码如下:

TapGestureRecognizer tapGestureRecognizer = new TapGestureRecognizer
{
    Buttons = ButtonsMask.Primary | ButtonsMask.Secondary
};

获取手势位置

可以通过对 对象调用 GetPosition 方法来 TappedEventArgs 获取点击手势发生的位置。 方法 GetPosition 接受参数 Element? ,并将位置作为 Point? 对象返回:

void OnTapGestureRecognizerTapped(object sender, TappedEventArgs e)
{
    // Position inside window
    Point? windowPosition = e.GetPosition(null);

    // Position relative to an Image
    Point? relativeToImagePosition = e.GetPosition(image);

    // Position relative to the container view
    Point? relativeToContainerPosition = e.GetPosition((View)sender);
}

参数 Element? 定义应获取相对于 位置的元素。 提供一个 null 值作为此参数意味着该方法 GetPosition 返回一个 Point? 对象,该对象定义点击手势在窗口内的位置。