その中に ItemViewer と呼ばれる別のコントロールを含む RackViewer と呼ばれるコントロールがあります。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;
}
しかし、何らかの理由で、このイベントは決して true を返しません! マウスを RackViewer コントロールのどこにドラッグしても、ItemViewer 上にあることを決して検出しないようです。私は何を間違っていますか?