将屏幕转换为客户端坐标问题

时间:2013-04-11 15:15:18

标签: c# .net winforms

我有一个名为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上。我做错了什么?

1 个答案:

答案 0 :(得分:0)

好的,我发现了错误。我的问题是dragEnter事件只触发一次,当鼠标将项目拖过rackviewer时它会向右触发。因此,鼠标永远不会有时间实际到达ItemViewer。谢谢你的帮助。我将不得不使用比DragEnter更动态的东西。