Waarom stopt het implementeren van WPF DragDrop-gedrag met het uitschakelen van ListBoxItems bij de eerste klik?

Ik ben al geruime tijd bezig met het implementeren van basis drag and drop-functionaliteit met wpf en C #. Ik heb altijd één probleem gehad nadat ik het heb geïmplementeerd ... om de een of andere reden stopt de functie slepen en neerzetten dat de ListBoxItem s niet meer wordt geselecteerd (bij de eerste klik).

Als ik op een ListBoxItem klik maar het niet versleep, wordt het niet geselecteerd en verschijnt het sleeppictogram kortstondig. Bij de volgende klik kan ik een van de ListBoxItem s selecteren en het sleeppictogram verschijnt niet. Deze cyclus herhaalt zich dan ... eerste klik zal niet selecteren, tweede zal.

Hieronder volgt een typische implementatie van mijn slepen-en-neerzetten-code, ontleend aan het Micorsoft MCTS 70-511 'Training kit' boek.

private void ListBox_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    object data = (ListBoxItem)(FrameworkElement)sender;
    if (data != null) DragDrop.DoDragDrop(ListBox, data, DragDropEffects.Copy);
    e.Handled = false;
}

private void ListBox_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(ListBoxItem))) e.Effects = DragDropEffects.Copy;
}

private void ListBox_Drop(object sender, DragEventArgs e)
{
    object data = e.Data.GetData(typeof(ListBoxItem));
    if (data != null) DoSomethingWith((DataType)((ListBoxItem)data).DataContext);
}

Het slepen en neerzetten werkt prima, maar de itemselectie niet ... Ik veronderstelde dat door e.Handled = false toe te voegen aan de ListBox_PreviewMouseLeftButtonDown handler, de ListBoxItem selectiemechanisme kan de klikgebeurtenis aan, maar bereikt nooit zo ver.

Ik heb ook geprobeerd om de sleepinitiatie in de MouseLeftButtonDown handler die is geïnstalleerd in de PreviewMouseLeftButtonDown handler instaed, maar het ListBoxItem selectiemechanisme verwerkt de klikgebeurtenis en het nooit die sleeplosser bereikt.

Er moet een manier zijn om de sleephandeling te starten en toch de ListBoxItem waarop is geklikt te hebben geselecteerd, maar het is mij nog steeds niet gelukt om deze te vinden ... aanwijzingen voor iedereen?

UPDATE >>>

Dankzij het MSDN-artikel waarvoor @icebat een koppeling verzorgde, heb ik de drag-en-drop-functionaliteit perfect kunnen laten werken. Het is nu als volgt:

private void SourceListBox_MouseMove(object sender, MouseButtonEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        object data = ((ListBox)(FrameworkElement)sender).SelectedItem;
        if (data != null) 
            DragDrop.DoDragDrop(SourceListBox, data, DragDropEffects.Copy);
    }
}

private void TargetListBox_DragOver(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(typeof(DragObject))) e.Effects = DragDropEffects.Copy;
}

private void TargetListBox_Drop(object sender, DragEventArgs e)
{
    object data = e.Data.GetData(typeof(DragObject));
    if (data != null) DoSomethingWith((DragObject)data);
}
0

1 antwoord

Gebruik de MouseMove -gebeurtenis in plaats van MouseDown voor slepen en neerzetten. U kunt meer informatie en een aantal codes vinden in het artikel slepen en neerzetten op MSDN.

2
toegevoegd
Ahhhhhh, dat is wat ik zocht! Erg bedankt.
toegevoegd de auteur Sheridan, de bron