MAUI:点击滑块值较小区域时如何禁用DragCompletedCommand
MAUI滑块禁止值减小后,点击小值区域仍触发DragCompletedCommand的问题
我在MAUI应用中实现了滑块值禁止减小的逻辑,但滑块的DragCompletedCommand在点击滑块值较小的区域时仍会触发并执行操作,需要禁用该场景下的命令触发。
尝试过的解决方案
- 在ViewModel中添加
bool变量,命令执行前判断该变量值:
public ICommand DragCompletedCommand => new Command(OnDragCompleted); private void OnDragCompleted(object obj) { if (invokeDragCompleted) { // 自定义操作 } }
- 在页面的
ValueChanged事件中设置该变量的值:
public void SliderValueChanged(object sender, ValueChangedEventArgs args) { try { Slider slider = (Slider)sender; IsIncrease = args.NewValue > args.OldValue; if (!IsIncrease) { hpvm.InputTransparent = true; slider.Value = args.OldValue; value = args.OldValue; hpvm.invokeDragCompleted = false; } else { hpvm.InputTransparent = false; slider.Value = args.NewValue; value = args.NewValue; hpvm.invokeDragCompleted = true; } } catch (Exception ex) { Debug.WriteLine("Exception:>>" + ex); } }
核心问题
每秒运行的定时器会持续触发ValueChanged事件,导致if和else分支交替执行,bool变量被反复设为true,命令仍会执行。需要解决两个问题:
- 点击值较小区域时如何将该变量设为false?
- 如何区分
ValueChanged事件是定时器触发还是用户触摸/拖动触发的?
初始滑块代码
<Slider x:Name="watchme_slider" Grid.Column="1" BackgroundColor="White" MinimumTrackColor="#1c98d7" MaximumTrackColor="#9a9a9a" ThumbImageSource="ic_thumb_xx.png" ValueChanged="SliderValueChanged" InputTransparent="{Binding InputTransparent}" Maximum="0.166666667" Minimum="0" DragCompletedCommand="{Binding DragCompletedCommand}" HorizontalOptions="FillAndExpand"/>
更新内容
更新后的滑块代码
<Slider x:Name="watchme_slider" Grid.Column="1" BackgroundColor="White" MinimumTrackColor="#1c98d7" MaximumTrackColor="#9a9a9a" ThumbImageSource="ic_thumb_xx.png" ValueChanged="SliderValueChanged" InputTransparent="{Binding InputTransparent}" Maximum="0.166666667" Minimum="0" HorizontalOptions="FillAndExpand"> <Slider.Behaviors> <toolkit:EventToCommandBehavior EventName="DragCompleted" Command="{Binding Source={x:Reference page}, Path=BindingContext.DragCompletedCommand}" CommandParameter="{Binding Source={x:Reference watchme_slider}}"/> </Slider.Behaviors> </Slider>
ViewModel修改
- 为
HomePageViewModel添加partial关键字:
public partial class HomePageViewModel : BaseViewModel, INotifyPropertyChanged
- 注释原
ICommand定义:
//public ICommand DragCompletedCommand => new Command(OnDragCompleted);
- 添加
RelayCommand并重命名方法:
[RelayCommand] public void DragCompleted(object obj) { var slider = obj as Slider; Debug.WriteLine("slider.Value:>>" + slider.Value); Debug.WriteLine("preValue:>>" + preValue); if (slider.Value > preValue) { Debug.WriteLine("do some work"); preValue = slider.Value; } }
内容的提问来源于stack exchange,提问作者Matthew Pans
相关产品推荐
相关产品推荐

