我遇到了这个问题。我有一帧pictureBox和treeview。我想从树视图拖放到图片框,在那个图片框中我画了另一张图片(第一个图片框是树形图中的地图,我有'唱歌')
private void pictureBox1_DragDrop(object sender, DragEventArgs e)
{
Type testTip = new TreeNode().GetType();
TreeNode dragedNode;
_mouseDownSelectionWindow= Rectangle.Empty;
if (e.Data.GetDataPresent(testTip))
{
dragedNode = (TreeNode)e.Data.GetData(testTip);
PictureBox picOneFaceUpA = new PictureBox();
picOneFaceUpA.Parent = MapView;
picOneFaceUpA.Tag = dragedNode;
TreeNode tr = (TreeNode)picOneFaceUpA.Tag;
Sing vr = (Sing)tr.Tag;
picOneFaceUpA.Name = vr.idSing;
vr.onMap = true;
int xCord = e.X;
int yCord = e.Y;
picOneFaceUpA.Location = MapView.PointToClient(new Point (xCord - 20, yCord - 20));
picOneFaceUpA.BackgroundImage = vr.image;
vr.location = picOneFaceUpA.Location;
dictionary.Add(picOneFaceUpA.Location, vr);
picOneFaceUpA.Size = new Size(40, 40);
picOneFaceUpA.BackgroundImageLayout = ImageLayout.Stretch;
picOneFaceUpA.BringToFront();
picOneFaceUpA.Focus();
}
}
这是有效的,但是如何连接,所以当我点击地图上的Sing时,它会得到某种焦点(框架或某物),并且它会选择我用于制作该图片框的treview中的treenode。
答案 0 :(得分:0)
当您将拖动的节点存储在PictureBox的标记中时,您已经创建了一个连接。
要使其正常工作,您需要为创建的PictureBoxes
编写一些事件。
这是最低限度:
点击后,我设置Border
,选择您已存储在Treenode
中的Tag
,并明确将焦点设置在PictureBox
上。 (点击时,PB通常不会得到焦点,所以我们需要在代码中执行它,因此我们可以捕获LostFocus
事件。)
picOneFaceUpA.Click += (ss,ee) => {
picOneFaceUpA.BorderStyle = BorderStyle.FixedSingle;
treeView1.SelectedNode = dragedNode;
picOneFaceUpA.Focus();
};
在LostFocus
我只需删除Border
:
picOneFaceUpA.LostFocus += (ss, ee) =>
{
picOneFaceUpA.BorderStyle = BorderStyle.None;
};
不要忘记设置树视图HideSelection = false;
,以便在焦点仍然在PB上时可以看到选择!
现在,根据您显示的图像,边框可能有点弱。为了获得更强的效果,您必须对Paint
事件进行编码,以便在控件顶部绘制更加华丽的内容..:
picOneFaceUpA.Paint += (ss, ee) =>
{
if (picOneFaceUpA.BorderStyle == BorderStyle.FixedSingle)
ee.Graphics.DrawRectangle(Pens.Orange, 0, 0,
picOneFaceUpA.ClientSize.Width - 1,
picOneFaceUpA.ClientSize.Height - 1);
};
在您的代码中,您使用picOneFaceUpA.Focus();
来电。这似乎与设置LostFocus
事件相冲突,因此必须删除它!