Я только что решил эту проблему в нашем приложении.
Что происходит, так это то, что ScrollViewer захватывает TouchDevice в своем обработчике PreviewTouchMove, который «крадет» TouchDevice из других элементов управления и не позволяет им получать PreviewTouchMove илиСобытия TouchMove.
Чтобы обойти эту проблему, необходимо реализовать пользовательский элемент управления Thumb, который захватывает TouchDevice в событии PreviewTouchDown и сохраняет ссылку на него до тех пор, пока не произойдет событие PreviewTouchUp.Затем элемент управления может «украсть» перехват обратно в свой обработчик LostTouchCapture, когда это необходимо.Вот некоторый краткий код:
public class CustomThumb : Thumb
{
private TouchDevice currentDevice = null;
protected override void OnPreviewTouchDown(TouchEventArgs e)
{
// Release any previous capture
ReleaseCurrentDevice();
// Capture the new touch
CaptureCurrentDevice(e);
}
protected override void OnPreviewTouchUp(TouchEventArgs e)
{
ReleaseCurrentDevice();
}
protected override void OnLostTouchCapture(TouchEventArgs e)
{
// Only re-capture if the reference is not null
// This way we avoid re-capturing after calling ReleaseCurrentDevice()
if (currentDevice != null)
{
CaptureCurrentDevice(e);
}
}
private void ReleaseCurrentDevice()
{
if (currentDevice != null)
{
// Set the reference to null so that we don't re-capture in the OnLostTouchCapture() method
var temp = currentDevice;
currentDevice = null;
ReleaseTouchCapture(temp);
}
}
private void CaptureCurrentDevice(TouchEventArgs e)
{
bool gotTouch = CaptureTouch(e.TouchDevice);
if (gotTouch)
{
currentDevice = e.TouchDevice;
}
}
}
Затем вам нужно будет перенастроить слайдер, чтобы использовать CustomThumb вместо стандартного элемента управления Thumb.