Moin,
Es gibt haufenweise Erklärungen dazu im Netz, aber so richtig will keiner bei mir funktionieren.
Ich versuche bei einer Drag&Drop Sortierung in einem DataGrid ein Popup am Mauszeiger mitlaufen zu lassen. Ich scheitere aber daran, dass das Popup dem Mauszeiger folgt.
Wie gesagt habe ich schon einiges ausprobiert und habe den bisher vielversprechendsten Erfolg bei dieser Variante:
Dann habe ich mir eine Methode aus dem Internet angesehen und etwas angepasst:
Im ContextModel.MousePosition ist die aktuelle Mausposition hinterlegt.
Wenn ich jetzt die Binding-Source für den Textblock aus dem Popup mit den Koordinaten versehe ( was ich testweise getan hatte ) funktioniert es einwandfrei:
Die Freude war groß, zerschlug sich allerdings schnell wieder, als ich die mittlere Zeile entfernt hatte, die eigentlich nur einen String befüllt und nichts mit der Position an sich zu tun hat.
Das Popup bleibt nun am ersten erkannten Mauszeigerpunkt stehen, egal wohin ich die Maus bewege.
Nehme ich die Zeile wieder rein, läuft das Popup sauber mit, hat aber den falschen Inhalt im Textblock.
Die Invalidate-Methoden habe ich auch schon probiert, aber es ändert sich nichts. Das Popup folgt der Maus nur, wenn ich den String anpasse:
Ich kann mir das grad nicht erklären und hoffe auf Hinweise vn euch.
Danke
Es gibt haufenweise Erklärungen dazu im Netz, aber so richtig will keiner bei mir funktionieren.
Ich versuche bei einer Drag&Drop Sortierung in einem DataGrid ein Popup am Mauszeiger mitlaufen zu lassen. Ich scheitere aber daran, dass das Popup dem Mauszeiger folgt.
Wie gesagt habe ich schon einiges ausprobiert und habe den bisher vielversprechendsten Erfolg bei dieser Variante:
Code:
<Popup x:Name="DragDropPopup" IsHitTestVisible="False" Placement="Custom" PlacementTarget="{Binding ElementName=dgItemsList}" AllowsTransparency="True"> <Border BorderBrush="#666" BorderThickness="2" Background="#0378DC" Opacity=".75" CornerRadius="8"> <StackPanel Orientation="Horizontal" Margin="10 5"> <Image Margin="0 0 10 0" Source="{Binding FileItemDragDropSortImage}" Height="25"/> <TextBlock Text="{Binding FileListDragDropCurrentItemLabel}" VerticalAlignment="Center" FontSize="18" FontWeight="DemiBold" Foreground="#fff"/> </StackPanel> </Border> </Popup>
Code:
public CustomPopupPlacement[] placementForPopup(System.Windows.Size popupSize, System.Windows.Size targetSize, System.Windows.Point offset) { return new CustomPopupPlacement[] { new CustomPopupPlacement( new System.Windows.Point(ContextModel.MousePosition.X, ContextModel.MousePosition.Y) , PopupPrimaryAxis.Vertical ) , new CustomPopupPlacement( new System.Windows.Point(ContextModel.MousePosition.X, ContextModel.MousePosition.Y) , PopupPrimaryAxis.Horizontal ) }; }
Wenn ich jetzt die Binding-Source für den Textblock aus dem Popup mit den Koordinaten versehe ( was ich testweise getan hatte ) funktioniert es einwandfrei:
Code:
// Dieser Code steckt in dem MouseMove Handler für das DataGrid! ContextModel.MousePosition = e.GetPosition(dgItemsList); ContextModel.FileListDragDropCurrentItemLabel = $"{e.GetPosition(this).X} , {e.GetPosition(this).Y}"; DragDropPopup.CustomPopupPlacementCallback = new CustomPopupPlacementCallback(placementForPopup);
Das Popup bleibt nun am ersten erkannten Mauszeigerpunkt stehen, egal wohin ich die Maus bewege.
Nehme ich die Zeile wieder rein, läuft das Popup sauber mit, hat aber den falschen Inhalt im Textblock.
Die Invalidate-Methoden habe ich auch schon probiert, aber es ändert sich nichts. Das Popup folgt der Maus nur, wenn ich den String anpasse:
Code:
ContextModel.FileListDragDropCurrentItemLabel = $"{e.GetPosition(this).X} , {e.GetPosition(this).Y}";
Danke
Comment