Используя эту ветку, я реализовал логику предотвращения уменьшения слайдера в своем приложении MAUI.
Но у меня есть DragCompletedCommand
и в Slider
, который выполняет некоторые действия. Здесь, при нажатии на нижнее время на слайдере, DragCompletedCommand
также нажимал и выполнял эти действия. Как я могу это отключить?
Я попробовал, как показано ниже: добавил переменную bool
в viewmodel
и проверил ее значение перед выполнением действий.
public ICommand DragCompletedCommand => new Command(OnDragCompleted);
private void OnDragCompleted(object obj)
{
if (invokeDragCompleted)
{
//My actions
}
}
Я устанавливаю это значение bool
из события homepage.xaml.cs
страницы 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);
}
}
Но это событие всегда срабатывает, когда таймер работает и попеременно срабатывает блок if и else. Таким образом, значение bool
становится истинным и выполняет действия над Viewmodel
. Есть ли способ установить для значения bool
значение false при выборе меньшего времени?
Мой код слайдера:
<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"/>
Таймер отсчитывает каждую секунду до события ValueChanged
. Если пользователь коснется или перетащит ползунок, в это время также сработает событие 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"
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>
Обновлен класс HomePageViewModel
с ключевым словом partial
:
public partial class HomePageViewModel : BaseViewModel, INotifyPropertyChanged
Комментарий ниже ICommand
:
//public ICommand DragCompletedCommand => new Command(OnDragCompleted);
Добавил RelayCommand
и переименовал функцию в DragCompleted
:
[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;
}
}
@LiqunShen-MSFT .net 8 на платформах Android и iOS
Вы устанавливаете событие slider.Value = args.OldValue;
в SliderValueChanged
. По этой причине срабатывают блоки if и else.
Насколько я понимаю, вы хотите совершать какие-то действия в DragCompletedCommand
только тогда, когда ползунок увеличивает свое значение. Верно?
Я могу добавить новое поле, возможно, назову его preValue
в ViewModel
, чтобы сохранить предыдущее значение ползунка.
private double preValue;
И проверьте, больше ли текущее значение,
[RelayCommand]
public void DragCompleted(object obj)
{
var slider = obj as Slider;
if (slider.Value > preValue)
{
Debug.WriteLine("do some work");
preValue = slider.Value;
}
}
Вот XAML, я использую EventToCommandBehavior из Maui CommunityToolkit.
<ContentPage xmlns = "http://schemas.microsoft.com/dotnet/2021/maui"
...
Title = "HomePage"
xmlns:toolkit = "http://schemas.microsoft.com/dotnet/2022/maui/toolkit"
x:Name = "page">
<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>
Я попробовал это, но событие DragCompleted
не запускается в первый раз.
Вы имеете в виду DragCompleted
событие, а не пожар? Не могли бы вы поделиться соответствующим кодом DragCompleted
?
Я использую RelayCommand
и EventToCommandBehavior
для слайдера. Вы используете тот же код, что и мой?
В моем коде отсутствовал RelayCommand, позвольте мне попробовать еще раз
Я все еще не стреляю, я обновил вопрос с учетом последних изменений, которые я внес, не могли бы вы проверить.
Вы устанавливаете x:Name = "page"
для ContentPage?
У меня также есть опция отмены в пользовательском интерфейсе: когда я нажимаю кнопку отмены нажатия, я устанавливаю значение ползунка на 0 следующим образом: watchme_slider.Value = 0;
. Но после этой реализации он не переходит в 0, я имею в виду, что ползунок не сбрасывается.
Не могли бы вы опубликовать соответствующий код для опции отмены? Насколько я понимаю, вы хотите, чтобы ползунок не уменьшал значение. Это причина, по которой сброс не работает?
При отмене просто сбрасываю время ползунка на 0, и для этого я использую этот однострочный код: watchme_slider.Value = 0;
. Предотвращение уменьшения значения ползунка — это было новое требование, и оно работает сейчас. После его реализации сброс не работал.
В событии SliderValueChanged
, кажется, когда args.NewValue > args.OldValue;
, оно установится slider.Value = args.OldValue;
. Тогда я думаю, что именно поэтому он не может сбросить значение ползунка на 0.
Спасибо за причину, я исправил это с помощью одной переменной bool
и Task.Delay
.
Могу ли я спросить, какую версию .NET и платформу вы используете?