Quelle: dotnetpro
WPF-TreeView und MVVM in Einklang bringen, Teil 3 16.08.2021, 00:00 Uhr

Scroll-Hilfen und Adorner

Ein wenig Komfort für das Drag-and-drop von TreeViewItems.
In den vorangegangenen beiden Teilen dieser Serie [1] [2] wurde die Basis für Drag-and-drop-Funktionen in Verbindung mit TreeViews im MVVM-Stil gelegt. Zuletzt ging es darum, wie man erreicht, dass die TreeView, über die der Anwender ein Item mit der Maus zieht, automatisch den für das Ablegen des gezogenen Items anvisierten Zielbereich aufklappt und anzeigt. Der Lösungsansatz im Demoprojekt besteht darin, während des Zieh-Vorgangs Steuerflächen im oberen beziehungsweise unteren Bereich der TreeView einzublenden, die beim Überfahren mit der Maus die gewünschte Bildlauf-Aktion auslösen. Als Steuerflächen werden hier einfach ContentControls angelegt und in einem Grid über der TreeView positioniert (erster Teil von Listing 1). DragOver ist der Event, der hier zu berücksichtigen ist.
Listing 1: Buttons als Scroll-Hilfe
<UserControl x:Class=

    "MVVM_Utilities.ExtendedTreeView"...>

  <Grid >    

    ...

    <!--Buttons für Scrolling während Drag-and-drop-->

    <ContentControl Name="ScrollUpBtn"

      Content="??" AllowDrop="True" 

      DragOver="ScrollUpBtn_DragOver"

      Visibility="Collapsed" .../>

    <ContentControl Name="ScrollDownBtn"

      Content="??" AllowDrop="True" 

      DragOver="ScrollDownBtn_DragOver"

      Visibility="Collapsed" .../>

    </Grid>

</UserControl>



public partial class ExtendedTreeView : UserControl

{

  ...

  private void TVI_MouseMove(object sender,

      MouseEventArgs e)

  {

    ...

    // Rahmenbedingungen für DragDrop-Start prüfen

    if (e.LeftButton == MouseButtonState.Pressed &&

       isDragging && DragDropController.CanDrag(ti))

    {

      ScrollUpBtn.Visibility = Visibility.Visible;

      ScrollDownBtn.Visibility = Visibility.Visible;



      // DoDragDrop kehrt erst nach Abschluss

      // der Aktion wieder zurück

      DragDrop.DoDragDrop(tvi, tvi.DataContext,

        DragDropEffects.All);



      // fertig

      ScrollUpBtn.Visibility = Visibility.Collapsed;

      ScrollDownBtn.Visibility = Visibility.Collapsed;

    }

  }

  // ScrollViewer aus Template des TreeViews ermitteln

  private ScrollViewer TVScrollViewer =>

    _tv_.Template.FindName(

    "_tv_scrollviewer_", _tv_) as ScrollViewer;

 

  // Hilfs-Buttons für Scrolling während Drag-and-drop

  private void ScrollUpBtn_DragOver(object sender,

      DragEventArgs e)

  {

    TVScrollViewer.LineUp();

    // Kein Drop zulassen

    e.Effects = DragDropEffects.None;

  }



  private void ScrollDownBtn_DragOver(

      object sender, DragEventArgs e)

  {

    TVScrollViewer.LineDown();

    // Kein Drop zulassen

    e.Effects = DragDropEffects.None;

  }

}

Jetzt 1 Monat kostenlos testen!

Sie wollen zukünftig auch von den Vorteilen eines plus-Abos profitieren? Werden Sie jetzt dotnetpro-plus-Kunde.
  • + Digitales Kundenkonto,
  • + Zugriff auf das digitale Heft,
  • + Zugang zum digitalen Heftarchiv,
  • + Auf Wunsch: Weekly Newsletter,
  • + Sämtliche Codebeispiele im digitalen Heftarchiv verfügbar