从树视图拖动到图片框并连接元素

时间:2015-06-07 23:43:00

标签: c#

我遇到了这个问题。我有一帧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。

1 个答案:

答案 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事件相冲突,因此必须删除它!