WPF 드래그앤드랍
어떤 분이 질문을 올리셨길레
궁금해서 해보았다.
연습삼아 ListView에 Button 을 넣어주고 드래그해서 canvas에 놓는 테스트이다.
먼저 Xaml
그리고, 코드 비하인드(code-behind)
궁금해서 해보았다.
연습삼아 ListView에 Button 을 넣어주고 드래그해서 canvas에 놓는 테스트이다.
먼저 Xaml
<Window x:Class="WpfApplication3.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Window1" Height="342" Width="300"> <Grid Height="253" Width="269"> <Grid.ColumnDefinitions> <ColumnDefinition Width="15*" /> <ColumnDefinition Width="131*" /> </Grid.ColumnDefinitions> <Canvas x:Name="mycanvas" DragDrop.DragOver="mycanvas_DragOver" DragDrop.DragEnter="Canvas_DragEnter" DragDrop.DragLeave="mycanvas_DragLeave" Drop="mycanvas_Drop" Mouse.MouseMove="Canvas_MouseMove" Mouse.MouseEnter="mycanvas_MouseEnter" AllowDrop="True" Grid.ColumnSpan="2" Margin="0,0,109,0" Background="AliceBlue"> </Canvas> <ListView x:Name="mylist" Grid.Column="1" HorizontalAlignment="Right" PreviewMouseLeftButtonDown="mylist_PreviewMouseLeftButtonDown" PreviewMouseMove="mylist_PreviewMouseMove" Width="58"> </ListView> <Button Height="23" Margin="0,0,0,-24" Name="button1" VerticalAlignment="Bottom" Grid.Column="1" Click="button1_Click" HorizontalAlignment="Right" Width="81.281">Button</Button> <Button Grid.Column="1" Height="23" Margin="66,0,100,-24" Name="button2" VerticalAlignment="Bottom">drag me</Button> </Grid> </Window>
그리고, 코드 비하인드(code-behind)
using System; using System.Collections.Generic; using System.Linq; using System.Text; 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 WpfApplication3 { /// <summary> /// Window1.xaml에 대한 상호 작용 논리 /// </summary> public partial class Window1 : Window { public Window1() { InitializeComponent(); } private void Canvas_DragEnter(object sender, DragEventArgs e) { Console.WriteLine("Drag enter"); Console.WriteLine(e.Source.ToString()); } private void Canvas_MouseMove(object sender, MouseEventArgs e) { Console.WriteLine("x: " + e.GetPosition(mycanvas).X + ", y : " + e.GetPosition(mycanvas).Y); } private void button1_Click(object sender, RoutedEventArgs e) { Button b = new Button(); b.Content = "Drag me"; mylist.Items.Add(b); } private void mycanvas_MouseEnter(object sender, MouseEventArgs e) { Console.WriteLine("mouse enter"); } private void mycanvas_DragOver(object sender, DragEventArgs e) { Console.WriteLine("mycanvas_DragOver "); } Point startPoint; private void mylist_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) { // Store the mouse position startPoint = e.GetPosition(null); } private void mylist_PreviewMouseMove(object sender, MouseEventArgs e) { // Get the dragged ListViewItem ListView listView = sender as ListView; ListViewItem listViewItem = FindAnchestor<ListViewItem>((DependencyObject)e.OriginalSource); if (listViewItem == null) return; // Find the data behind the ListViewItem Button hello = listView.ItemContainerGenerator. ItemFromContainer(listViewItem) as Button; // Initialize the drag & drop operation DataObject dragData = new DataObject("myFormat", hello); DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Move); } // Helper to search up the VisualTree private static T FindAnchestor<T>(DependencyObject current) where T : DependencyObject { do { if (current is T) { return (T)current; } current = VisualTreeHelper.GetParent(current); } while (current != null); return null; } private void mycanvas_DragLeave(object sender, DragEventArgs e) { Console.WriteLine("mycanvas_DragLeave"); Console.WriteLine((e.Data.GetType())); } private void mycanvas_Drop(object sender, DragEventArgs e) { Console.WriteLine("Drop"); Console.WriteLine((e.Data.GetData("myFormat") as Button).Content); } } }
http://www.wpftutorial.net/DragAndDrop.html 여기 참고 하였다.
요점은 DataObject 만들어서 DoDragDrop 해줘야 canvas에서 AllowDrop 를 true했을때
drag관련 이벤트가 제대로 발생된다.
댓글
댓글 쓰기