2016-07-24 4 views
0

Ich habe die letzten paar Tage damit verbracht, herauszufinden, wie ich die DragDrop-Funktion in C# 's WPF verwenden könnte, um eine Schaltfläche zu erstellen und sie im Canvas herumzuziehen. Ich denke, dass ich etwas vermisse, aber nach einer anstrengenden Recherche kann ich nicht herausfinden, was es ist. Ich muss lediglich den Knopf in der Leinwand ziehen.Wie kann ich eine Schaltfläche ziehen, die sich in WPF befindet?

Hier mein XAML-Code ist:

x:Class="DragDrop_Test.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:DragDrop_Test" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 

    <Canvas Name="MyCanvas" Width = "300" Height= "200" Background="WhiteSmoke" Margin= "10, 0,190,100" AllowDrop="True" Drop="Canvas_Drop"> 
     <Button Name="btn" Content="Button1" MouseMove="btn_MouseMove" PreviewMouseLeftButtonDown="btn_PreviewMouseLeftButtonDown"> 

     </Button> 
    </Canvas> 


</Window> 

Und hier ist mein Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace DragDrop_Test 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     Control draggedItem; 
     bool IsDragging; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      IsDragging = false; 
     } 


     private void Canvas_Drop(object sender, DragEventArgs e) 
     { 
      if (!IsDragging) 
       return; 

      IsDragging = false; 
     } 



     private void btn_MouseMove(object sender, MouseEventArgs e) 
     { 
      var dependencyObject = (Button)sender; 
      draggedItem = dependencyObject; 

      if (!IsDragging) 
       return; 
      if (dependencyObject != null && dependencyObject.IsMouseOver) 
      { 
       DragDrop.DoDragDrop(dependencyObject, dependencyObject, DragDropEffects.Move); 
      } 
     } 

     private void btn_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      IsDragging = true; 
      draggedItem = (Button)sender; 
     } 
    } 
} 

Vielen Dank im Voraus

+0

Siehe auch https://stackoverflow.com/questions/7810683/moving-button-in-a-canvas für spezifische Details in Bezug auf das Ziehen von Schaltflächen im Besonderen. –

Antwort

0

Wenn ich Sie richtig verstehe, 'Drag and Drop' nicht was du brauchst. Es ist eine Methode der Datenübertragung, kein Location-Setter. Wie pro msdn:

Drag-and-Drop bezieht sich allgemein auf ein Verfahren zur Datenübertragung dass beinhaltet eine Maus (oder eine andere Zeigevorrichtung) unter Verwendung ein oder mehr Objekte auszuwählen, zieht über diese Objekte einige gewünschte Drop-Ziel in der Benutzeroberfläche (UI) und Drop

Wenn alles, was Sie wollen, ist die Taste bewegen, könnten Sie versuchen Canvas.SetTop/Canvas.SetLeft oder TranslateTransform verwenden. Vielleicht etwas wie:

public partial class MainWindow : Window 
    { 
     Control draggedItem; 
     Point itemRelativePosition; 
     bool IsDragging; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      IsDragging = false; 
     } 

     private void btn_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
     { 
      IsDragging = true; 
      draggedItem = (Button)sender; 
      itemRelativePosition = e.GetPosition(draggedItem); 
     } 

     private void btn_PreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
     { 
      if (!IsDragging) 
       return; 

      IsDragging = false; 
     } 

     private void btn_PreviewMouseMove(object sender, MouseEventArgs e) 
     { 
      if (!IsDragging) 
       return; 

      Point canvasRelativePosition = e.GetPosition(MyCanvas); 

      Canvas.SetTop(draggedItem, canvasRelativePosition.Y - itemRelativePosition.Y); 
      Canvas.SetLeft(draggedItem, canvasRelativePosition.X - itemRelativePosition.X); 
     } 
    } 
+0

Wissen ist wirklich Macht. Vielen Dank, es hätte Wochen gedauert, um herauszufinden, dass Dragdrop nicht der richtige Weg ist, dies zu tun. –