2016-08-17 2 views
1

Я создал приложение Windows Forms, но я получаю странное поведение от свойства Capture элемента управления.Control.Capture всегда верен?

На чистом виде, с одним лейблом под названием «label1» и код

public Form1() 
{ 
    InitializeComponent(); 

    label1.MouseDown += pictureBox1_MouseDown; 
} 

void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Debug.WriteLine(label1.Capture); 
    label1.Capture = !label1.Capture; 
    Debug.WriteLine(label1.Capture); 
} 

я наблюдал, что первый WriteLine всегда говорит: «Правда», второй всегда говорит: «Ложь», когда нажата кнопка. Даже при нажатии несколько раз.

Метка никогда не реагирует на клики за пределами ее границы, даже если я использую вместо этого label1.Capture = true.

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

+0

Использование одного и того же обработчика событий для двух элементов управления может ввести в заблуждение. Когда вы нажмете «Ярлык», вы получите правду. И обязательно, False, когда вы нажимаете PictureBox. Winforms использует свойство Capture для надежного создания события Click и включает его перед запуском события MouseDown. Необходимо, чтобы событие Click * не * было поднято, когда вы отпустите мышь, перетащив ее за пределы границы элемента управления. Использование свойства Capture самостоятельно (как в случае «реакции на клики снаружи») вряд ли будет работать. –

ответ

1

В случае MouseDown для элемента управления всегда устанавливается значение true. Поэтому обычно, если вы выполняете команду MouseDown, а затем не отпускаете кнопку мыши, выведите мышь из-под контроля, а затем отпустите кнопку мыши, произойдет событие MouseUp элемента управления.

Если вы установите Capture в false в MouseDown, то мыши вверх событие вашего контроля будет стрелять только если мышь находится над контролем и при перемещении мышей вне вашего контроля, а затем отпустите кнопку мыши, MouseUp события вашего контроля не будет повышаться.

Также в MouseUp захват будет выпущен автоматически.

Для получения дополнительной информации посмотрите на эти ресурсы:

+0

Спасибо. Я прихожу из WPF, где это обрабатывается по-разному. – Jens

Смежные вопросы