Курсоры мыши
76WPF --- Элементы управления WPF --- Курсоры мыши
В любом приложении обычно требуется изменять курсор мыши, чтобы он показывал, когда приложение занято, или отражал работу разных элементов управления. Курсор мыши можно задать для любого элемента с помощью свойства 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.