События мыши и фокуса

Последнее обновление: 22.01.2016

В WPF для мыши определены следующие события:

Событие

Тип события

Описание

GotMouseCapture

Поднимающееся

Возникает при получении фокуса с помощью мыши

LostMouseCapture

Поднимающееся

Возникает при потере фокуса с помощью мыши

MouseEnter

Прямое

Возникает при вхождении указателя мыши в пределы элемента

MouseLeave

Прямое

Возникает, когда указатель мыши выходит за пределы элемента

MouseLeftButtonDown

Поднимающееся

Возникает при нажатии левой кнопки мыши

PreviewMouseLeftButtonDown

Прямое (но как и при туннельных событиях, событие генерируется на всех контейнерах дерева элементов)

Возникает при нажатии левой кнопки мыши

MouseLeftButtonUp

Поднимающееся

Возникает при освобождении левой кнопки мыши

PreviewMouseLeftButtonUp

Прямое (но как и при туннельных событиях, событие генерируется на всех контейнерах дерева элементов)

Возникает при освобождении левой кнопки мыши

MouseRightButtonDown

Поднимающееся

Возникает при нажатии правой кнопки мыши

PreviewMouseRightButtonDown

Прямое (но как и при туннельных событиях, событие генерируется на всех контейнерах дерева элементов)

Возникает при нажатии правой кнопки мыши

MouseRightButtonUp

Поднимающееся

Возникает при освобождении правой кнопки мыши

PreviewMouseRightButtonUp

Прямое (но как и при туннельных событиях, событие генерируется на всех контейнерах дерева элементов)

Возникает при освобождении правой кнопки мыши

MouseDown

Поднимающееся

Возникает при нажатии кнопки мыши

PreviewMouseDown

Туннельное

Возникает при нажатии кнопки мыши

MouseUp

Поднимающееся

Возникает при освобождении кнопки мыши

PreviewMouseUp

Туннельное

Возникает при освобождении кнопки мыши

MouseMove

Поднимающееся

Возникает при передвижении указателя мыши

PreviewMouseMove

Туннельное

Возникает при передвижении указателя мыши

MouseWheel

Поднимающееся

Возникает при передвижении колесика мыши

PreviewMouseWheel

Туннельное

Возникает при передвижении колесика мыши

Если вдруг мы не хотим, чтобы элемент генерировал события мыши, то мы можем у него установить свойство IsHitTestVisible="False"

Большинство обработчиков событий мыши в качестве параметра получают объект MouseEventArgs, имеющий ряд интересных свойств и методов, которые мы можем использовать:

  • ButtonState: возвращает состояние кнопки мыши. Хранит одно из значений перечисления MouseButtonState:

    • Pressed: кнопка наата

    • Released: кнопка отжата

  • ChangedButton: получает кнопку, которая ассоциирована с данным событием. Хранит одно из значений перечисления MouseButton:

    • Left: левая кнопка мыши

    • Middle: средняя кнопка мыши

    • Right: правая кнопка мыши

    • XButton1: дополнительная кнопка мыши

    • XButton2: дополнительная кнопка мыши

  • ClickCount: хранит число сделанных нажатий

  • LeftButton: хранит состояние левой кнопки мыши в виде MouseButtonState

  • MiddleButton: хранит состояние средней кнопки мыши в виде MouseButtonState

  • RightButton: хранит состояние правой кнопки мыши в виде MouseButtonState

  • XButton1: хранит состояние первой дополнительной кнопки

  • XButton2: хранит состояние второй дополнительной кнопки

  • GetPosition(): метод, который возвращает координаты нажатия в виде объекта Point

Например, используем метод GetPosition(). Для этого установим для грида обработчик:

<Grid MouseDown="Grid_MouseDown">

И определим этот обработчик:

private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
    Point p = e.GetPosition(this);
    MessageBox.Show("Координата x=" +p.X.ToString()+ " y="+p.Y.ToString());
}

События перетаскивания

События перетаскивания (drag & drop) связаны с перетаскиванием элементов, когда пользователь, нажимая на элементе мышкой и удерживая мышь нажатой, перемещает указатель на другой элемент, тем самым перемещая на этот элемент ранее нажатый.

Событие

Тип события

Описание

DragEnter

Поднимающееся

Возникает при перетаскивании при вхождении указателя мыши в пределы элемента

DragOver

Поднимающееся

Возникает при перемещении курсора в пределах границ элемента управления

DragLeave

Поднимающееся

Возникает при перемещении курсора мыши за пределы элемента

Drop

Поднимающееся

Возникает при завершении перетаскивания

PreviewDragEnter

Тунельное

Возникает при перетаскивании при вхождении указателя мыши в пределы элемента

PreviewDragOver

Тунельное

Возникает при перемещении курсора в пределах границ элемента управления

PreviewDragLeave

Тунельное

Возникает при перемещении курсора мыши за пределы элемента

PreviewDrop

Тунельное

Возникает при завершении перетаскивания

Эти события используют объект DragEventArgs, который имеет ряд свойств и методов:

  • GetPosition: возвращает позицию мыши

  • Data: объект, представляющий буфер обмена - то есть те данные, которые перемещаются

  • Effects и AllowedEffects: представляют эффект перетаскивния. Хранят одно из значений перечисления DragDropEffects:

    • All: данные копируются из источника в целевой элемент с удалением из источника

    • Copy: данные просто копируются из источника в целевой элемент

    • Link: данные из источника связываются с данными из целевого элемента

    • Move: данные перемещаются из источника в целевой элемент

    • None: отсутствие эффекта

    • Scroll: данные прокручиваются при копировании в целевой элемент

  • KeyStates: хранит значение из перечисления DragDropKeyStates, которое указывает, какая клавиша клавиатуры или мыши зажата во время перетаскивания: LeftMouseButton, RightMouseButton, MiddleMouseButton, ShiftKey, ControlKey, AltKey, None

Посмотрим на примере. Допустим, у нас следующая разметка xaml:

<Window x:Class="EventsApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:EventsApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="250" Width="400">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>
        <DockPanel >
            <TextBox x:Name="textBox1" MouseDown="textBox1_MouseDown" />
        </DockPanel>

        <Button x:Name="button1" Grid.Row="1" AllowDrop="True" Drop="button1_Drop"  />
    </Grid>
</Window>

Здесь мы будем перемещать введенный текст из текстового поля на кнопку. Чтобы кнопка могла принимать перемещаемые объекты, установим ее свойство AllowDrop="True". Одни элементы на другие, то нам надо у элементов-приемников всегда устанавливать данное свойство.

Здесь также подключены два обработчика события, которые мы зададим в коде C#:

private void textBox1_MouseDown(object sender, MouseButtonEventArgs e)
{
    DragDrop.DoDragDrop(textBox1, textBox1.Text, DragDropEffects.Copy);
}

private void button1_Drop(object sender, DragEventArgs e)
{
    button1.Content = e.Data.GetData(DataFormats.Text);
}

Чтобы захватить элемент для переноса, нам надо вызвать метод DragDrop.DoDragDrop, который в качестве первого параметра принимает элемент-источник, с которого идет перетаскивание, второй параметр - что перетаскиваем (в данном случае текст), и третий параметр - тип эффекта. Так как в данном случае у нас копирование, то устанавливаем DragDropEffects.Copy. Также мы можем использовать и другие константы: Move, None, Link, Scroll, All.

Введем текст в текстовое поле, выделим его, нажмем левой кнопкой и, не отпуская, переместим курсор в пределы кнопки. И отпустим. Здесь уже возникнет событие Drop кнопки, обработчик которого также прост: мы присваиваем ее содержимому данные перетаскивания. И поскольку мы перетаскиваем текст, то в качестве параметра выставляем DataFormats.Text

События получения/потери фокуса

При обработке событий фокуса следует помнить, что элемент может получать фокус только в том случае, если его свойство Focusable имеет значение true.

Чтобы программным способом передать элементу фокус, надо вызвать у него методы Focus или MoveFocus:

textBox1.Focus();

Событие

Тип события

Описание

GotFocus

Поднимающееся

Возникает при получении фокуса

LostFocus

Поднимающееся

Возникает при потере фокуса

GotKeyboardFocus

Поднимающееся

Возникает при получении фокуса с помощью клавиатуры

PreviewGotKeyboardFocus

Туннельное

Возникает при получении фокуса с помощью клавиатуры

LostKeyboardFocus

Поднимающееся

Возникает при потере фокуса с помощью клавиатуры

PreviewLostKeyboardFocus

Туннельное

Возникает при потере фокуса с помощью клавиатуры

Обработем событие получения фокуса для текстового поля:

<TextBox GotFocus="TextBox_GotFocus"  />

В файле кода пропишем обработчик:

private void TextBox_GotFocus(object sender, RoutedEventArgs e)
{
    MessageBox.Show("Получение фокуса");
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850