2017-05-27 71 views
1

我試圖創建一個畫布,它將ListView中的項目放到用戶需要的位置。WPF Canvas不會觸發DragEnter和Drop

畫布不會觸發我的DragEnter和Drop事件。這是我的ListView和Canvas屬性的代碼。

private void itemList_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    startPoint = e.GetPosition(null); 
    isDragging = true; 
} 

private void itemList_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point mousePos = e.GetPosition(null); 
    Vector diff = startPoint - mousePos; 

    if (e.LeftButton == MouseButtonState.Pressed && 
     (Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance || 
     Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)) 
    { 
     ListView listView = sender as ListView; 
     ListViewItem listViewItem = 
      FindAncestor<ListViewItem>((DependencyObject)e.OriginalSource); 

     Model.Resource student = (Model.Resource)listView.ItemContainerGenerator. 
      ItemFromContainer(listViewItem); 

     dragItem = new DDitem(student.getName(), student.getIco()); 

     DataObject dragData = new DataObject("myFormat", dragItem); 

     DragDrop.DoDragDrop(listViewItem, dragData, DragDropEffects.Move); 
    } 
} 

現在爲CanvasListView<Canvas>

private static T FindAncestor<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 can_DragEnter(object sender, DragEventArgs e) 
{ 
    if (!e.Data.GetDataPresent("myFormat") || sender == e.Source) 
    { 
     e.Effects = DragDropEffects.None; 
    } 
    Console.WriteLine("Pokusava drag enter"); 
} 

private void can_Drop(object sender, DragEventArgs e) 
{ 
    Console.WriteLine("Pokusava drop"); 
    if (e.Data.GetDataPresent("myFormat")) 
    { 
     Model.Resource student = e.Data.GetData("myFormat") as Model.Resource; 
     resources.Remove(student); 
     isDragging = false; 
    } 
} 

我的XAML代碼如下

<Canvas Name="can" Background="Transparent" Margin="10,10,10,0" Grid.Row="1" AllowDrop="True" DragEnter="can_DragEnter" Drop="can_Drop" /> 
<ListView x:Name="itemList" Grid.Column="1" HorizontalAlignment="Stretch" Margin="7,23,6,0" Grid.Row="1" VerticalAlignment="Stretch" Background="#324251" ItemsSource="{Binding Path=resources}" FontSize="16" Foreground="Wheat" PreviewMouseLeftButtonDown="itemList_PreviewMouseLeftButtonDown" MouseMove="itemList_MouseMove" > 
      <ListView.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Image Source="{Binding ico}" Width="70" Height="70"></Image> 
         <TextBlock Text="{Binding name}" HorizontalAlignment="Center" VerticalAlignment="Center"></TextBlock> 
        </StackPanel> 
       </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 

輸出沒有給出異常或錯誤。

+0

這可能聽起來很蠢,但你可以請嘗試將畫布背景更改爲任何內容但不透明並再試一次?我記得很多年前我發生過這種事。 –

+0

我嘗試了很多顏色,但仍然沒有運氣... – Riki

回答

0

固定的問題,問題是,我已經把Canvas之前Image

現在,我已經跑到了另外一個問題,我想加我UserControlDDItem到畫布上,但沒有運氣。它應該跟隨我的鼠標指針,當我釋放鼠標時,它應該放在畫布上。它確實被添加到我拖放項目的列表中,但我無法看到它。我DDItem

XAML代碼如下

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="61*"/> 
     <RowDefinition Height="14*"/> 
    </Grid.RowDefinitions> 
    <Image x:Name="mask" Source="{Binding Path=src}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Stretch="Fill" Grid.Row="0"/> 
    <Label x:Name="label" Content="{Binding Path=name}" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Grid.Row="1" Foreground="Wheat" FontSize="40"/> 

</Grid> 

代碼我DDItem類中

public partial class DDitem : UserControl 
{ 
    private string _name; 
    private string _path; 
    private Point position; 
    public string name 
    { 
     get; 
     set; 
    } 
    public string path 
    { 
     get; 
     set; 
    } 
    public DDitem(string name, string path) 
    { 
     this.name = name; 
     this.path = path; 
     this.Width = 100; 
     this.Height = 100; 
     this.DataContext=this; 
     InitializeComponent(); 
    } 

    public Point getPosition() 
    { 
     return position; 
    } 
    public void setPosition(Point pos) 
    { 
     position = pos; 
    } 
} 

現在對於我的畫布事件:

private void can_DragEnter(object sender, DragEventArgs e) 
    { 
     if (!e.Data.GetDataPresent("myFormat") || sender == e.Source) 
     { 
      e.Effects = DragDropEffects.None; 
     } 
    } 

    private void can_Drop(object sender, DragEventArgs e) 
    { 
     if (e.Data.GetDataPresent("myFormat")) 
     { 
      can.Children.Add(dragItem); 
      dragItem.Visibility = Visibility.Visible; 
      Canvas.SetTop(dragItem, dragItem.getPosition().Y); 
      Canvas.SetLeft(dragItem, dragItem.getPosition().X); 
      isDragging = false; 
      resOnCanvas.Add(dragItem); 
     } 
    } 

    private void can_DragOver(object sender, DragEventArgs e) 
    { 
     if (dragItem != null) 
     { 
      if (!dragItem.IsVisible) 
      { 
       dragItem.Visibility = Visibility.Visible; 
      } 
      dragItem.setPosition(e.GetPosition(can)); 
      Console.WriteLine(dragItem.getPosition().X + " " + dragItem.getPosition().Y); 
     } 
    }