如何为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
相关产品推荐
相关产品推荐

