2013-04-20 7 views
0

У меня есть следующая проблема: у меня есть панель, которая имеет определенный цвет, например красный. Когда пользователь нажимает на мышь, цвет этой панели сохраняется в переменной. Затем пользователь перемещается, его мышь все еще нажата, на другую панель. Когда он отпускает мышь, эта панель должна получить цвет фона первого, который был сохранен в переменной. Мой код выглядит примерно так:Событие для мыши не срабатывает

public Color currentColor; 
    private void ColorPickMouseDown(object sender, MouseEventArgs e) 
    { 
     Panel pnlSender = (Panel)sender;     
     currentColor = pnlSender.BackColor; 
    } 

    private void AttempsColorChanger(object sender, MouseEventArgs e) 
    { 
     Panel pnl = (Panel)sender; 
     pnl.BackColor = currentColor; 
    } 

Мне нужно сначала определить отправителя, потому что существует много возможных панелей, которые могут инициировать это событие. Первый метод MouseDown работает полностью, цвет хорошо сохраняется в переменной. Секон, однако, даже не срабатывает, когда пользователь делает то, что я описал выше. Когда ser нажимает на вторую панель, он работает (есть часть MouseUp в щелчке, как я полагаю).

Что здесь не так? Почему событие не срабатывает, когда пользователь удерживает клавишу мыши раньше?

+0

Возникает ли событие mouse up, если вы оставите мышь над первой панелью (щелкните вниз, затем вверх, не двигаясь)? Я подозреваю. – Gjeltema

+0

Да, это так. Кажется, что программа не отслеживает положение мыши больше после события MouseDown ... – tomet

+0

Фактически это фиксируется вашей исходной панелью, то есть событием 'MouseUp', которое запускается. –

ответ

3

(Этот ответ подразумевает, что вы используете Windows Forms.)

Это может быть то, что вам нужно захватить мышь, установив this.Capture = true в MouseDown контроля источника. (See Control.Capture)

Если вы сделали это окно источника получит MouseUp события, и это было бы источник окна что было определить целевое окно под координатами мыши. Вы можете сделать это, используя Control.GetChildAtPoint() (см. this answer о переполнении стека).

Use Windows Forms Drag and Drop Support Instead! < - Нажмите для получения дополнительной информации

Я собираюсь предложить вам стиснуть зубы и использовать Drag .Net и Отбросьте методы, чтобы сделать это. Это требует некоторого чтения, но это будет много лучше использовать его.

Вы начинаете перетаскивание в ответ на событие MouseDown по телефону Control.DoDragDrop().

Затем вам нужно обработать событие Control.DragDrop в контроле цели капли.

Есть еще несколько вещей, которые вам могут понадобиться, чтобы настроить его; см. документацию Control.DoDragDrop() для примера.

(For WPF drag and drop support, see here.)

1

, когда мышь ввести цель управления, мышь вниз triggerd анг цель ПОЛУЧИТЬ BackColor! вам нужно добавить логический флаг в код:

public Color currentColor;  
bool flag=false; 
    private void ColorPickMouseDown(object sender, MouseEventArgs e) 
    { 
     if(flag==false) 
     { 
     flag=true 
     Panel pnlSender = (Panel)sender;     
     currentColor = pnlSender.BackColor; 
     } 
    } 
    //assume mouse up for panles 
    private void AttempsColorChanger(object sender, MouseEventArgs e) 
    { 
     if(flag==true) 
     { 
     Panel pnl = (Panel)sender; 
     pnl.BackColor = currentColor; 
     flag=flase; 
     } 
    } 

, а также вам необходимо изменить свой флаг в MouseMove (если)

0

Как я уже говорил в моем комментарии Событие мышей захватываются инициирующим управлением, Вы бы вероятно, лучше использовать функциональность DragDrop, встроенную в Windows Forms. Что-то вроде этого должно работать на вас. Я назначил общие обработчики событий, поэтому их можно назначить всем вашим панелям и просто работать.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void panel_MouseDown(object sender, MouseEventArgs e) 
    { 
     ((Control)sender).DoDragDrop(((Control)sender).BackColor,DragDropEffects.All); 
    } 

    private void panel_DragDrop(object sender, DragEventArgs e) 
    { 
     ((Control)sender).BackColor = (Color)e.Data.GetData(BackColor.GetType()); 
    } 
    private void panel_DragEnter(object sender, DragEventArgs e) 
    { 
     e.Effect = DragDropEffects.Copy; 
    } 

} 
0

Я знаю, что это старый вопрос, но у меня была такая же проблема, и ни один из вышеперечисленных ответов не работал для меня. В моем случае мне пришлось обрабатывать событие MouseMove в целевом элементе управления и проверять, чтобы мышь была выпущена. Я установил «BringToFront» на моей целевой панели на всякий случай, что помог вообще.

public Color currentColor; 
private void ColorPickMouseDown(object sender, MouseEventArgs e) 
{ 
    Panel pnlSender = (Panel)sender;     
    currentColor = pnlSender.BackColor; 
} 

private void panelTarget_MouseMove(object sender, MouseEventArgs e) 
{ 
    //the mouse button is released 
    if (SortMouseLocation == Point.Empty) 
    { 
     Panel pnl = (Panel)sender; 
     pnl.BackColor = currentColor; 
    } 
} 
Смежные вопросы