複数のページを持つ .TIFF ファイルを表示する FlowLayoutPanel を使用する WinForm アプリケーションがあります。FlowLayoutPanel は、すべてのページを ThumbNails ビューに表示します。
個々のアイテムに対して正常に機能するドラッグ ドロップ ロジックを実装しました。ここで、ユーザーが (CTRL または Shift キーを使用して) 複数のサムネイルを選択し、別の場所にドラッグ ドロップできるように変更したいと思います。
//** Logic after each thumbnail is generated:
PictureBox thumb = new myProject.utility.PictureBox(pageNum);
thumb.Image = doc.getThumb(pageNum); //since we pre loaded, we won't stall the gui thread.
thumb.Click += new System.EventHandler(
(thumbSend, thumbEvent) =>
{
highLightThumb(thumb.getPage());
}
);
thumb.DoubleClick += new System.EventHandler(
(thumbSend, thumbEvent) =>
{
selectedDoc = thumb.getPage();
me.Visible = false;
}
);
thumbFlow.Controls.Add(thumb);
if (selectedDoc == pageNum)
highLightThumb(pageNum);
//** Highlight Methods
private void highLightThumb(int page)
{
//clear highlight
foreach (Control c in thumbFlow.Controls)
{
if (c is PictureBox)
{
((PictureBox)c).highlight = false;
}
}
//apply highlight
foreach (Control c in thumbFlow.Controls)
{
if (c is PictureBox)
{
PictureBox thumbFrame = (PictureBox)c;
if (page == thumbFrame.getPage())
thumbFrame.highlight = true;
}
}
}
以下は、既存のドラッグ ドロップ ロジックです。
//**********************//
//** Drag/Drop Events **//
//**********************//
private void thumbFlow_DragDrop(object sender, DragEventArgs e)
{
PictureBox data = (PictureBox)e.Data.GetData(typeof(PictureBox));
FlowLayoutPanel _destination = (FlowLayoutPanel)sender;
Point p = _destination.PointToClient(new Point(e.X, e.Y));
var item = _destination.GetChildAtPoint(p);
if (item == null)
{
p.Y = p.Y - 10;
item = _destination.GetChildAtPoint(p);
}
int index = _destination.Controls.GetChildIndex(item, false);
if (index < 0)
return;
_destination.Controls.SetChildIndex(data, index);
_destination.Invalidate();
}
private void thumbFlow_DragEnter(object sender, DragEventArgs e)
{
//apply/clear highlight
foreach (Control c in thumbFlow.Controls)
{
if (c is PictureBox)
{
PictureBox thumbFrame = (PictureBox)c;
if (thumbFrame == ActiveControl)
{
thumbFrame.highlight = true;
}
else
{
((PictureBox)c).highlight = false;
}
}
}
e.Effect = DragDropEffects.Move;
if (dragDropOccurred == false)
{
dragDropOccurred = true;
}
}
//** Scroll when user drags above or below the window object **//
private void thumbFlow_DragLeave(object sender, EventArgs e)
{
int BegY_ThumbFlow = this.thumbFlow.FindForm().PointToClient(this.thumbFlow.Parent.PointToScreen(this.thumbFlow.Location)).Y;
int thumbFlowBound_Y = this.thumbFlow.Height + BegY_ThumbFlow;
int mouseY = this.thumbFlow.FindForm().PointToClient(MousePosition).Y;
while (mouseY >= thumbFlowBound_Y)
{
thumbFlow.VerticalScroll.Value = thumbFlow.VerticalScroll.Value + DRAG_DROP_SCROLL_AMT;
mouseY = thumbFlow.FindForm().PointToClient(MousePosition).Y;
thumbFlow.Refresh();
}
while (mouseY <= BegY_ThumbFlow)
{
thumbFlow.VerticalScroll.Value = thumbFlow.VerticalScroll.Value - DRAG_DROP_SCROLL_AMT;
mouseY = thumbFlow.FindForm().PointToClient(MousePosition).Y;
thumbFlow.Refresh();
}
}
私が見ているオプションは、highLightThumb メソッドを変更して、CTRL または Shift キーが選択されているかどうかを確認し、ハイライトを無効にしないことです。
if (Control.ModifierKeys != Keys.Control)
//**
if (Control.ModifierKeys != Keys.Shift)
次に、DragDrop DragEnter ルーチンを変更します。どんな助けでも大歓迎です。