我有一个名为RackViewer的控件,其中包含另一个名为ItemViewer的控件。 RackViewer控件动态添加到另一个父控件。在父控件中,我希望创建一个拖放事件,这样当用户在RackViewer中的ItemViewer控件上拖动一个项目时,事件就会触发。目前我这样做:
private void RackView_DragEnter(object sender, DragEventArgs e)
{
RackViewer rackView = (RackViewer)sender;
if (rackView.IsMouseOnItemViewer(rackView.PointToClient(new Point(e.X, e.Y))))
{
//content goes here
}
}
private void RackView_DragDrop(object sender, DragEventArgs e)
{
RackViewer rackView = (RackViewer)sender;
if(rackView.IsMouseOnItemViewer(rackView.PointToClient(new Point(e.X, e.Y))))
{
//content goes here
}
}
private void listbox_MouseDown(object sender, MouseEventArgs e)
{
ListBox dragDropSender = (ListBox)sender;
int index = dragDropSender.IndexFromPoint(new Point(e.X, e.Y));
if (index >= 0)
{
dragDropSender.SelectedIndex = index;
dragDropSender.DoDragDrop(dragDropSender.SelectedItem, DragDropEffects.Move);
}
}
注意IsMouseOnItemViewer方法。此方法包含在rackViewer类中,并确认用户在继续执行拖放事件序列之前将项目拖动到ItemViewer上。我这样做的原因是因为我无法从RackViewer的父控件访问ItemViewer,因为它在层次结构中是2个更高的控件。 “IsMouseOnItemViewer”方法如下所示:
public ItemViewer View { get {return itemViewer; } }
/// <param name="mousePoint"> The coordinates of the mouse in client coordinates. </param>
/// <returns> True if the user is hovering over the ItemViewer control and false otherwise.</returns>
public bool IsMouseOnItemViewer(Point mousePoint)
{
if (View.Bounds.Contains(mousePoint))
return true;
else
return false;
}
然而,由于某种原因,这个事件永远不会真实!无论我将鼠标拖到RackViewer控件上,它似乎永远不会检测到它在ItemViewer上。我做错了什么?
答案 0 :(得分:0)
好的,我发现了错误。我的问题是dragEnter事件只触发一次,当鼠标将项目拖过rackviewer时它会向右触发。因此,鼠标永远不会有时间实际到达ItemViewer。谢谢你的帮助。我将不得不使用比DragEnter更动态的东西。