You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为PanGestureRecognizer的PanUpdated使用toolkit:EventToCommandBehavior

问题描述

我想将如下代码:

<Ellipse.GestureRecognizers>
  <PanGestureRecognizer PanUpdated="some_event"></PanGestureRecognizer>
</Ellipse.GestureRecognizers>

转换为类似绑定命令的形式:

<Ellipse.GestureRecognizers>
  <PanGestureRecognizer.Behaviours>
    <toolkit:EventToCommandBehavior
      EventName="PanUpdated"
      Command="{Binding PanUpdatedCommand}" />
  </PanGestureRecognizer.Behaviours>
</Ellipse.GestureRecognizers>

但无法使用PanGestureRecognizer.Behaviours属性,请问该如何为PanUpdated事件使用toolkit:EventToCommandBehavior?

补充场景:需将PanUpdated事件中event.TotalX、event.TotalY计算得到的PanX、PanY存入ViewModel并传递给仓储层;UI为摇杆样式,拖动椭圆时需实时将坐标发送至后端,因此希望使用PanGestureRecognizer。

解决方案

直接将EventToCommandBehavior附加到Ellipse控件本身即可——PanGestureRecognizer触发的PanUpdated事件会冒泡到Ellipse控件上,具体实现步骤如下:

1. XAML布局代码

<Ellipse>
    <Ellipse.GestureRecognizers>
        <PanGestureRecognizer />
    </Ellipse.GestureRecognizers>
    <Ellipse.Behaviors>
        <toolkit:EventToCommandBehavior
            EventName="PanUpdated"
            Command="{Binding PanUpdatedCommand}"
            EventArgsConverter="{StaticResource PanUpdatedEventArgsConverter}" />
    </Ellipse.Behaviors>
</Ellipse>

2. 实现事件参数转换器

创建转换器提取PanUpdatedEventArgs中的坐标数据,转换为ViewModel可直接使用的模型:

public class PanUpdatedEventArgsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value is PanUpdatedEventArgs args)
        {
            // 可根据摇杆实际逻辑调整坐标计算方式
            return new PanCoordinateModel
            {
                PanX = args.TotalX,
                PanY = args.TotalY
            };
        }
        return null;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

// 用于传递坐标数据的模型类
public class PanCoordinateModel
{
    public double PanX { get; set; }
    public double PanY { get; set; }
}

3. ViewModel中的命令实现

在ViewModel里定义命令,接收转换后的坐标数据并传递到仓储层:

public ICommand PanUpdatedCommand { get; }
private readonly IYourRepository _repository;

public YourViewModel(IYourRepository repository)
{
    _repository = repository;
    PanUpdatedCommand = new Command<PanCoordinateModel>(HandlePanUpdated);
}

private void HandlePanUpdated(PanCoordinateModel coordinates)
{
    // 实时将坐标传递给仓储层
    _repository.SendPanCoordinates(coordinates.PanX, coordinates.PanY);
}

4. 注册转换器资源

在XAML的资源字典中注册转换器:

<ResourceDictionary>
    <local:PanUpdatedEventArgsConverter x:Key="PanUpdatedEventArgsConverter" />
</ResourceDictionary>

这种方式既保留了PanGestureRecognizer的实时拖动特性,又通过命令绑定实现了MVVM模式下的数据传递,完全适配摇杆实时发送坐标的场景。

内容的提问来源于stack exchange,提问作者infinitesimal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:04:58