c # – ¿Detectar el evento de desplazamiento de ListBox?

¿Hay un evento activado cuando un ListBox comienza a desplazarse?

Actualmente tengo el siguiente código para permitir un arrastrar y soltar sin problemas desde un cuadro de lista.

<ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal" Margin="-5"  />
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate >
                    <DataTemplate>

                        <Image  ManipulationStarted="ListImage_ManipulationStarted" Tag="{Binding selfReference}"   x:Name="ListImage" Margin="2.5" Stretch="Fill" Source="{Binding thumbnailURL}" Height="64" Width="64"/>

                    </DataTemplate>
                </ListBox.ItemTemplate>

            </ListBox>

Y luego en el código.

private void ListImage_ManipulationStarted(object sender, ManipulationStartedEventArgs e)
        {
            if (dImage == null)
            {
                SoundEffectModel selectedModel = (sender as Image).Tag as SoundEffectModel;
                int newIndex = listBoxSource.Items.IndexOf(selectedModel);
                if (newIndex != -1)
                {
                    listBoxSource.SelectedIndex = newIndex;
                }
            }
        }

Luego duplico el elemento seleccionado en el cuadro de lista y lo coloco directamente sobre la ubicación actual del elemento seleccionado. Todo funciona bien.

Sin embargo, si el usuario comienza a desplazar el listBox en lugar de arrastrar el elemento alrededor de la aplicación, la imagen duplicada se encuentra en la parte superior del listBox y no parece profesional. Tan pronto como el usuario levanta el dedo, se elimina el elemento duplicado, porque puedo detectar el evento de manipulación completa, y me doy cuenta de que el elemento está en el “lugar equivocado”.

¿Hay alguna forma de que elimine el elemento cuando comienza el desplazamiento en lugar de esperar el evento de manipulación completa?

Related preguntas para el context:

Mejor respuesta
No, no se activa un evento cuando se desplaza el ListBox, sin embargo, puede ubicar el ScrollViewer que se encuentra dentro de la plantilla de ListBox y manejar el evento ValueChanged que ocurre tan pronto como comienza el desplazamiento.

Puede localizar la barra de desplazamiento de la siguiente manera:

/// <summary>
/// Searches the descendants of the given element, looking for a scrollbar
/// with the given orientation.
/// </summary>
private static ScrollBar GetScrollBar(FrameworkElement fe, Orientation orientation)
{
  return fe.Descendants()
            .OfType<ScrollBar>()
            .Where(s => s.Orientation == orientation)
            .SingleOrDefault();

}

Esto usa Linq to Visual Tree, como se describe en this blog post.

Por favor indique la dirección original:c # – ¿Detectar el evento de desplazamiento de ListBox? - Código de registro