none
Warum verschwindet ein DragAndDrop-Adorner hinter verschiedenen WPF-Controls? RRS feed

  • Frage

  • Hallo zusammen,

    in einem WPF-Window habe ich 2 DataGrids und möchte per DragAndDrop Items aus einem DataGrid in das andere DataGrid verschieben. Dazu setze ich einen DragAdorner ein, der den Inhalt der zu verschiebenden DataRow beim Drag anzeigt.

    <Window...
      <Window.DataContext>
         <viewModel:ZuordnenDialogViewModel/>
      </Window.DataContext>
      <Window.Resources>
          <local:DataGridDragDropAdorner x:Key="dgAdorner"/>
          <CollectionViewSource x:Key="DataGrid1ViewSource" 
                                Source="{Binding Daten1}"/>
          <CollectionViewSource x:Key="DataGrid2ViewSource" 
                                Source="{Binding Daten2}"/>
      </Window.Resources>
    
      <DockPanel LastChildFill="True">
          <Canvas x:Name="adornerLayer" Visibility="Collapsed"  DockPanel.Dock="Top"/>
          <DataGrid x:Name="dg1"
                    DockPanel.Dock="Top"
                    Style="{DynamicResource DataGridStyleDg1}"
                    local:DragDropHelper.IsDragSource="True"
                    local:DragDropHelper.DragDropControl="{StaticResource dgAdorner}"
                    local:DragDropHelper.AdornerLayer="adornerLayer"
                    local:DragDropHelper.DropTarget="dg2">
                    ItemsSource="{Binding Source={StaticResource DataGrid1ViewSource}}"
          </DataGrid>
          <DataGrid x:Name="dg2"
                    DockPanel.Dock="Top"
                    Style="{DynamicResource DataGridStyleDg2}"
                    local:DragDropHelper.IsDragSource="True"
                    local:DragDropHelper.DragDropControl="{StaticResource dgAdorner}"
                    local:DragDropHelper.AdornerLayer="adornerLayer"
                    local:DragDropHelper.DropTarget="dg1">
                    ItemsSource="{Binding Source={StaticResource DataGrid2ViewSource}}"
          </DataGrid>
    
      </DockPanel>
    </Window>

    Ziehe ich die Maus aus dem DataGrid, so wird der AdornerLayer sichtbar, ziehe ich die Maus jedoch wieder über die DataGrids, so verschwindet der AdornerLayer. Die DataGrids habe ich mit verschiedenen Styles als Dynamic-Ressources belegt.

    Liegt das Verhalten des AdornerLayers an den Styles oder woran kann das noch liegen???

    Gruß Jürgen

    Donnerstag, 22. September 2016 07:28

Antworten

  • Hallo,

    ich denke mal das sich der Adorner im Z-Index hinter den Controls befindet und deshalb verschwindet.

    Versuch doch mal den Adorner erst im Drag Event per Code zu erzeugen

    private void DragMe_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
    var dItem = (UIElement)sender;
    var myAndornerLayer = AdornerLayer.GetAdornerLayer(dItem);
    myAndornerLayer.Add(new SimpleCircleAdorner(dItem));
    }
    
     public class SimpleCircleAdorner : Adorner
        {
            public SimpleCircleAdorner(UIElement adornedElement)
                : base(adornedElement)
            {
            }
    
            protected override void OnRender(DrawingContext drawingContext)
            {
                Rect adornedElementRect = new Rect(this.AdornedElement.DesiredSize);
    
                // Some arbitrary drawing implements.
                SolidColorBrush renderBrush = new SolidColorBrush(Colors.Gray);
                renderBrush.Opacity = 0.2;
                Pen renderPen = new Pen(new SolidColorBrush(Colors.Gray), 2.0);
                double renderRadius = 5;
    
                // Draw a circle at each corner.
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopLeft, renderRadius, renderRadius);
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.TopRight, renderRadius, renderRadius);
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomLeft, renderRadius, renderRadius);
                drawingContext.DrawEllipse(renderBrush, renderPen, adornedElementRect.BottomRight, renderRadius, renderRadius);
            }
        }
    

    Gruß

    Thomas


    Icon für UWP: https://www.microsoft.com/store/apps/9nblggh5fzpm


    Donnerstag, 22. September 2016 23:16