Событие DragStarted не попадает в слайдер UWP - c #

Я хочу изменить положение видео в зависимости от того, насколько я перетаскиваю ползунок. Итак, я хочу использовать события DragStarted и DragCompleted. Но он показывает: «Локальное свойство« Dragstarted »может применяться только к типам, производным от« Thumb »». Как я могу включить его в свое приложение?

 <Slider Name="timelineSlider" Thumb.DragCompleted= "timelineSlider_DragCompleted" DragStarting="timelineSlider_DragStarting" DragOver="timelineSlider_DragOver" Width="300" />

Также обнаружено, что есть события DragStarting и DragOver. Имеет ли он ту же функциональность, что и события Dragstarted и DragCompleted? К сожалению, события DragStarting и DragOver не запускаются, когда я перетаскиваю ползунок.


person nsds    schedule 15.01.2018    source источник
comment
Вы можете подумать об использовании PointerCaptureLost .   -  person Romasz    schedule 15.01.2018


Ответы (3)


Вы можете попробовать ManipulationStarted и ManipulationCompleted события Slider.

 <Slider ManipulationCompleted="Slider_ManipulationCompleted" ManipulationMode="All" ManipulationStarted="Slider_ManipulationStarted"/>

Вы должны установить для ManipulationMode значение значение, отличное от System или None, если вы хотите обрабатывать события манипуляции, такие как ManipulationStarted, из элементов пользовательского интерфейса в коде приложения.

private void Slider_ManipulationCompleted(object sender, ManipulationCompletedRoutedEventArgs e)
{
    var slide= sender as Slider;
    Debug.WriteLine(slide.GetType().ToString());
    Debug.WriteLine(slide.Value+ ">>Slider_ManipulationCompleted");
}

private void Slider_ManipulationStarted(object sender, ManipulationStartedRoutedEventArgs e)
{
    var slide = sender as Slider;
    Debug.WriteLine(slide.GetType().ToString());
    Debug.WriteLine(slide.Value+ "Slider_ManipulationStarted");
}
person Breeze Liu - MSFT    schedule 16.01.2018

PointerCaptureLost хорошо работает в приложении UWP.

Пример XAML:

<Slider x:Name="SeekSlider" PointerCaptureLost="SeekSlider_PointerCaptureLost"/>

Пример C #:

private void SeekSlider_PointerCaptureLost(object sender, Windows.UI.Xaml.Input.PointerRoutedEventArgs e)
{
    Slider slider = sender as Slider;
    if (slider != null)
    {
        //mediaPlayer.Position = (float)slider.Value;
    }
}

Меня устраивает.

person Kamil    schedule 15.05.2019

Вы можете более легко использовать событие ValueChanged, чтобы увидеть изменения в положении Slider:

<Slider x:Name="Slider" ValueChanged="Slider_OnValueChanged" />

Вы можете использовать e.NewValue, чтобы получить новое значение ползунка, и e.OldValue, чтобы получить предыдущую позицию.

private void Slider_OnValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
    Debug.WriteLine($"Slider moved from {e.OldValue} to {e.NewValue}");
}
person Martin Zikmund    schedule 15.01.2018
comment
Событие no ValueChanged не будет соответствовать моим требованиям, поскольку оно вызывается каждый раз, когда ползунок меняет свое значение. даже если видео воспроизводится. Я просто хочу вызвать событие, перетаскивая только ползунок. - person nsds; 15.01.2018
comment
В этом случае вы, вероятно, могли бы использовать VisualTreeHelper из UWP Community Toolkit для доступа к ползунку Thumb и подключения событий DragStarted и DragEnded, которые установили бы только флаг, который бы сказал, что пользователь взаимодействует, а событие ValueChanged вызвано пользователем - person Martin Zikmund; 15.01.2018
comment
Что я использовал в одном из своих приложений: событие Focuslost ... @ Мартин: можете ли вы отправить ссылку на VisualTreeHelper? Я не могу найти его в приложении UWP Community Toolkit. - person thezapper; 15.01.2018
comment
Я ошибся насчет названия - это VisualTreeExtensions - docs.microsoft.com / ru-ru / windows / uwpcommunitytoolkit / extensions / - person Martin Zikmund; 15.01.2018