2016-08-26 3 views
1

이것은 기본적인 질문 일 수 있습니다. 그러나 방금 WPF를 사용하기 시작했고 간단한 드래그 앤 드롭을 시도하는 데 문제가 있습니다. 캔버스의 StackPanel 내에서 WPF 끌어서 놓기 버튼

나는이 ToolboxButton 클래스를 생성 :

public class ToolboxButton : Button 
{ 
    private bool _isDragging = false; 
    private Point _startPoint; 

    public ToolboxButton(string content) 
    { 
     Content = content; 
     HorizontalAlignment = HorizontalAlignment.Stretch; 
     Height = 30; 
     Loaded += ToolboxButton_Loaded; 
    } 

    void ToolboxButton_Loaded(object sender, RoutedEventArgs e) 
    { 
     PreviewMouseLeftButtonDown += ToolboxButton_PreviewMouseLeftButtonDown; 
     PreviewMouseMove += ToolboxButton_PreviewMouseMove; 
    } 

    void ToolboxButton_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed && !_isDragging) 
     { 
      Point position = e.GetPosition(null); 

      if (Math.Abs(position.X - _startPoint.X) > SystemParameters.MinimumHorizontalDragDistance || 
        Math.Abs(position.Y - _startPoint.Y) > SystemParameters.MinimumVerticalDragDistance) 
      { 
       StartDrag(e); 
      } 
     } 
    } 

    void ToolboxButton_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     _startPoint = e.GetPosition(null); 
    } 

    private void StartDrag(MouseEventArgs e) 
    { 
     _isDragging = true; 
     DataObject data = new DataObject(System.Windows.DataFormats.Text.ToString(), "abcd"); 
     DragDrop.DoDragDrop(e.Source as ToolboxButton, data, DragDropEffects.Move); 
     _isDragging = false; 
    } 
} 

이 버튼과 같이 StackPanel에 추가됩니다 :

ToolboxButton btnAddButton = new ToolboxButton("Button"); 
_toolboxView.Children.Add(btnAddButton); // _toolboxView is a stackpanel 

그리고 난 다음 코드를 사용하여 캔버스 있습니다

public class DesignerView : Canvas 
{ 
    public DesignerView() 
    { 
     AllowDrop = true; 
     DragOver += DesignerView_DragOver; 
     Drop += DesignerView_Drop; 
     PreviewDragOver += DesignerView_PreviewDragOver; 
    } 

    void DesignerView_PreviewDragOver(object sender, DragEventArgs e) 
    { 
     MessageBox.Show("previewdragover"); 
    } 

    void DesignerView_DragOver(object sender, DragEventArgs e) 
    { 
     MessageBox.Show("dragover"); 
     if (!e.Data.GetDataPresent(typeof(ToolboxButton))) 
     { 
      e.Effects = DragDropEffects.None; 
      e.Handled = true; 
     } 
    } 

    void DesignerView_Drop(object sender, DragEventArgs e) 
    { 
     MessageBox.Show("drop"); 
     if (e.Data.GetDataPresent(typeof(ToolboxButton))) 
     { 
      ToolboxButton droppedThingie = e.Data.GetData(typeof(ToolboxButton)) as ToolboxButton; 
      MessageBox.Show("You dropped: " + droppedThingie.Content); 
     } 
    } 

    public UIElement GetView() 
    { 
     return this; 
    } 
} 

Canvas와 StackPanel이 주 창에 다음과 같이 추가되었습니다.

Grid contentGrid = new Grid(); 
Content = contentGrid; 
contentGrid.Children.Add(_toolboxView.GetView()); 
contentGrid.Children.Add(_designerView.GetView()); 

아무런 메시지 상자도 실행되지 않아 그 이유를 찾을 수 없습니다. 커서가 "Can not pin (핀 수 없음)"으로 바뀌고, 내부에 대각선이있는 검은 색 원이 나타납니다. 내가 빠진 것이 있습니까? 모든 것이 XML없이 코드에서 수행되기를 바랍니다. 아마도 StackPanel에서 뭔가를해야하지만 거기에 ToolboxButton의 코드를 시도해도 작동하지 않습니다.

+0

이 방법이 완벽하게 작동합니다 (이 예 버튼에서) 개체를 드래그. 방금 시도했습니다. –

답변

0

모든 작업을 완료했음을 알 수 있습니다. 바로 DesignerView_drop이 수정되었습니다.

사용은 횡령에 sender 목적은 WindowsForms에서

void DesignerView_Drop(object sender, DragEventArgs e) 
{ 
    MessageBox.Show("drop"); 
    Button btn = (Button)sender; 

    contentGrid.Children.Add(btn); 
} 
+0

이벤트가 시작되지 않습니다. 어쨌든 작동하지 않기 때문에이 코드 줄을 추가하지 않았습니다. –

+0

내가 이것을 사용할 때 xaml 파일에서 이벤트를 선언했습니다 ... – armandasalmd

관련 문제