拖动时的键盘事件

时间:2011-12-06 19:07:49

标签: c# winforms drag-and-drop

我在表单上有两个标签。我希望能够将一个标签拖到另一个标签上,当鼠标左键仍然按下时,我希望能够按空格键在“foo”和“bar”之间切换目标标签的文本。

似乎所有输入事件都被抑制,而鼠标左键未被释放。

我错过了什么吗?有样品吗?

3 个答案:

答案 0 :(得分:2)

查看GiveFeedback事件。也许你可以从那里检查是否按下了一个键。

编辑:

void panel1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
    if (Keyboard.IsKeyDown(Key.Space))
    {
        if (label1.Text == "foo") label1.Text = "bar"; else label1.Text = "foo";
    }
}

并添加对PresentaionCore的引用和:WindowBase(您将在以下位置找到它:C:\ Program Files(x86)\ ReferenceAssemblies \ Microsoft \ Framework \ v3.0 \。)

你必须稍微玩这个。

答案 1 :(得分:0)

如果拖动的元素永远不会离开原始形式,请考虑解释鼠标事件而不是使用D& D机制。它不会那么好,但它会让你在拖动过程中解释其他消息。

public class MyForm : Form
{
    private Label label;

    public MyForm()
    {
        KeyPress += new KeyPressEventHandler(Form_KeyPress);
        label = new Label();
        label.Text = "foo";
        label.MouseMove += new MouseEventHandler(label_MouseMove);
        Controls.Add(label);
    }

    private void label_MouseMove(object sender, MouseEventArgs e)
    {
        if (MouseButtons == MouseButtons.Left)
        {
            Point loc = label.Location;
            loc.Offset(e.X, e.Y);
            label.Location = loc;
        }
    }

    private void Form_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == ' ')
        {
            if (label.Text == "foo")
                label.Text = "bar";
            else
                label.Text = "foo";
        }
    }
}

答案 2 :(得分:-1)

//尝试这样的事情并根据需要更改适合您工作示例的内容

  public partial class Form1 : Form 
  {
      public Form1()
      {
        InitializeComponent();
        label1.MouseDown += new MouseEventHandler(label1_MouseDown);         
        textBox1.AllowDrop = true;
        textBox1.DragEnter += new DragEventHandler(textBox1_DragEnter);
        textBox1.DragDrop += new DragEventHandler(textBox1_DragDrop);
      }

      void label1_MouseDown(object sender, MouseEventArgs e)
      {
        DoDragDrop(label1.Text, DragDropEffects.Copy);
      }

      void textBox1_DragEnter(object sender, DragEventArgs e)
      {
        if (e.Data.GetDataPresent(DataFormats.Text))
         e.Effect = DragDropEffects.Copy;
      }

      void textBox1_DragDrop(object sender, DragEventArgs e)
      {
        textBox1.Text = (string)e.Data.GetData(DataFormats.Text);
      }
  }