【问题标题】:Drag from treeview to picture box and connect elements从树视图拖动到图片框并连接元素
【发布时间】:2015-06-08 18:19:02
【问题描述】:

我被这个问题困住了。我有一帧图片框和树视图。我想从树视图拖放到图片框,在那个图片框中我画了另一张图片(第一个图片框是树视图中的地图,我有'Sings')

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 中选择树节点。

【问题讨论】:

    标签: c#


    【解决方案1】:

    当您将拖动的节点存储在 PictureBox 的标签中时,您已经创建了一个连接。

    要使其工作,您需要为创建的PictureBoxes 编写一些事件。

    这是最低要求:

    点击时我设置了一个Border,选择你已经存储在Tag中的Treenode,并明确将焦点设置在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();call。这似乎与设置 LostFocus 事件发生冲突,因此必须将其删除!

    【讨论】:

    • Tnx 人,但是当我添加代码应用程序崩溃时“尝试读取或写入受保护的内存。这通常表明其他内存已损坏。”我在该方法中添加了该代码....
    • 这很奇怪。您应该按照设置 picOneFaceUpA 元素的所有其他属性的顺序添加代码。
    • 我做到了。我把它放在picOneFaceUpA.BackgroundImageLayout = ImageLayout.Stretch; 之后
    • 我已经把双击事件和它的工作正常......` picOneFaceUpA.MouseDoubleClick += (ss, ee) => { frmCulturalMonument frame = new frmCulturalMonument(picOneFaceUpA.Name);框架.ShowDialog(); this.refresh(); }`
    • 好的,听起来不错。其他事件还有问题吗?您将需要删除picOneFaceUpA.Focus();call,因为它似乎与LostFocus 事件的创建相冲突! (是的,我可以重现各种错误,具体取决于我将它移动到的位置。我想定时版本会起作用,但实际上有必要吗?)我已经更新了我的答案..
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2010-10-04
    • 2020-07-09
    • 1970-01-01
    • 2018-08-17
    • 2013-04-06
    • 2011-01-31
    • 2022-06-24
    相关资源
    最近更新 更多