Курсоры мыши

76

В любом приложении обычно требуется изменять курсор мыши, чтобы он показывал, когда приложение занято, или отражал работу разных элементов управления. Курсор мыши можно задать для любого элемента с помощью свойства Cursor, унаследованного от класса FrameworkElement.

Каждый курсор представляется объектом System.Windows.Input.Cursor. Получить объект Cursor проще всего с помощью статических свойств класса Cursors (из пространства имен System.Windows.Input). Они включают все стандартные указатели Windows, такие как песочные часы, рука, стрелки изменения размеров и т.д. Вот пример, где для текущего окна устанавливаются песочные часы:

this.Cursor = Cursors.Wait;

Теперь при перемещении курсора мыши над текущим окном он примет вид песочных часов (в Windows ХР) или вращающегося кружка (в Windows Vista и Windows 7).

Свойства класса Cursors используют курсоры, определенные в компьютере. Если пользователь изменит набор стандартных курсоров, то создаваемое приложение будет использовать эти измененные курсоры.

При указании курсора в XAML не нужно использовать класс Cursors напрямую. Это объясняется тем, что преобразователь типов (TypeConverter) для свойства Cursor может распознавать имена свойств и выбирать соответствующий объект Cursor из класса Cursors. Это означает, что можно написать разметку, подобную нижеследующей, которая отображает курсор "справки" (сочетание стрелки и вопросительного знака), когда указатель мыши наведен на кнопку:

<Button Cursor="Help">Help</Button>

Возможно перекрытие параметров курсора, и тогда берется наиболее специальный курсор. Например, можно задать разные курсоры для кнопки и окна, в котором она находится. Курсор кнопки будет отображаться при перемещении указателя над кнопкой, а курсор окна — в любом другом участке окна.

Из этого правила есть одно исключение. Родительский элемент может перекрыть параметры курсора своих потомков с помощью свойства ForceCursor. Если ему присвоено значение true, то свойство потомка Cursor игнорируется, а вместо него везде применяется родительское свойство Cursor.

Если требуется применить параметры курсора к каждому элементу в каждом окне приложения, то свойство FrameworkElement.Cursor бесполезно. Вместо него вам следует использовать статическое свойство Mouse.OverrideCursor, которое переопределяет свойство Cursor каждого элемента:

Mouse.OverrideCursor = Cursors.Wait ;

Чтобы отменить это перекрытие, действующее в рамках всего приложения, нужно присвоить свойству Mouse.OverrideCursor значение null.

И, наконец, WPF без каких-либо проблем поддерживает пользовательские курсоры — как обычные (файлы .cur, просто небольшие картинки), так и анимированные (.ani). Чтобы задействовать пользовательский указатель, нужно передать имя нужного файла курсора или поток с данными курсора конструктору объекта Cursor.

Объект Cursor не поддерживает напрямую синтаксис URI, который позволяет другим элементам WPF (таким как Image) работать с файлами, хранящимися в скомпилированной сборке. Однако ничто не мешает добавить файл указателя в приложение в качестве ресурса, а затем извлечь его как поток, который можно использовать для создания объекта Cursor. Для этого предназначен метод Application.GetResourceStream():

StreamResourceInfo sri = Application.GetResourceStream (
   new Uri("mycursor.ani", UriKind.Relative));
Cursor customCursor = new Cursor(sri.Stream);
this.Cursor = customCursor;

Здесь подразумевается, что в проект добавлен файл mycursor.ani, а параметру Build Action присвоено значение Resource.

Пройди тесты
Лучший чат для C# программистов