Пользовательский курсор в WPF?

Посмотрите на этот пример Plnkr

Переменная this сильно отличается timesCalled с каждым нажатием кнопки увеличивается только на 1. Ответ на мой личный вопрос:

.click( () => { } )

и

.click(function() { })

создают одинаковое количество функции при использовании в цикле, как вы можете видеть из подсчета Guid в Plnkr.

47
задан Dave Clemmer 1 August 2011 в 16:09
поделиться

5 ответов

У Вас есть две основных опции:

  1. , Когда курсор мыши по Вашему управлению, скройте системный курсор установкой this.Cursor = Cursors.None; и потяните свой собственный курсор с помощью любой техники, которую Вы любите. Затем обновите положение и появление Вашего курсора путем ответа на события от нажатия мыши. Вот два примера:

  2. Создает новый объект Курсора путем загрузки изображения из .cur или .ani файла. Можно создать и отредактировать эти виды файлов в Visual Studio. Существуют также некоторые свободные утилиты, плавающие вокруг для контакта с ними. В основном они - изображения (или изображения с анимацией), которые определяют "горячую точку", указывающую, в какую точку в изображении курсор расположен.

, Если Вы принимаете решение загрузиться из файла, обратите внимание необходимость в абсолютном пути файловой системы для использования Cursor(string fileName) конструктор. Неубедительно, относительный путь или URI Пакета не будут работать. , Если необходимо загрузить курсор из относительного пути или из ресурса, упакованного блоком, необходимо будет получить поток из файла и передать его в Cursor(Stream cursorStream) конструктор. Раздражающий, но верный.

, С другой стороны, определяя курсор как относительный путь при загрузке его с помощью атрибута XAML делает работа, факт, который Вы могли использовать, чтобы загрузить Ваш курсор на скрытое управление и затем скопировать ссылку для использования на другом управлении. Я не попробовал его, но это должно работать.

33
ответ дан PeterAllenWebb 26 November 2019 в 19:20
поделиться

Также проверьте BabySmash Scott Hanselman (www.codeplex.com/babysmash). Он использовал больше метода "грубой силы" сокрытия курсора окон и показа, что его новый курсор на холсте и затем перемещении курсора к был "реальным" курсором, будет

Read больше здесь: http://www.hanselman.com/blog/DeveloperDesigner.aspx

1
ответ дан rudigrobler 26 November 2019 в 19:20
поделиться

Вы могли попробовать это

<Window Cursor=""C:\WINDOWS\Cursors\dinosaur.ani"" />
2
ответ дан palehorse 26 November 2019 в 19:20
поделиться

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

, Например, скажите, что Вы хотели отобразить нестандартные курсоры в зависимости от выбранного инструмента.

Добавляют к ресурсам:

<Window.Resources>
    <ResourceDictionary>
        <TextBlock x:Key="CursorGrab" Cursor="Resources/Cursors/grab.cur"/>
        <TextBlock x:Key="CursorMagnify" Cursor="Resources/Cursors/magnify.cur"/>
    </ResourceDictionary>
</Window.Resources>

Пример встроенного курсора сослался в коде:

if (selectedTool == "Hand")
    myCanvas.Cursor = ((TextBlock)this.Resources["CursorGrab"]).Cursor;
else if (selectedTool == "Magnify")
    myCanvas.Cursor = ((TextBlock)this.Resources["CursorMagnify"]).Cursor;
else
    myCanvas.Cursor = Cursor.Arrow;

-Ben

31
ответ дан Ben McIntosh 26 November 2019 в 19:20
поделиться

Есть более простой способ, чем управлять отображением курсора самостоятельно или использовать Visual Studio для создания множества пользовательских курсоров.

Если у вас есть FrameworkElement, вы можете создать из него Cursor, используя следующий код:

public Cursor ConvertToCursor(FrameworkElement visual, Point hotSpot)
{
  int width = (int)visual.Width;
  int height = (int)visual.Height;

  // Render to a bitmap
  var bitmapSource = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
  bitmapSource.Render(visual);

  // Convert to System.Drawing.Bitmap
  var pixels = new int[width*height];
  bitmapSource.CopyPixels(pixels, width, 0);
  var bitmap = new System.Drawing.Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppPArgb);
  for(int y=0; y<height; y++)
    for(int x=0; x<width; x++)
      bitmap.SetPixel(x, y, Color.FromArgb(pixels[y*width+x]));

  // Save to .ico format
  var stream = new MemoryStream();
  System.Drawing.Icon.FromHandle(resultBitmap.GetHicon()).Save(stream);

  // Convert saved file into .cur format
  stream.Seek(2, SeekOrigin.Begin);
  stream.WriteByte(2);
  stream.Seek(10, SeekOrigin.Begin);
  stream.WriteByte((byte)(int)(hotSpot.X * width));
  stream.WriteByte((byte)(int)(hotSpot.Y * height));
  stream.Seek(0, SeekOrigin.Begin);

  // Construct Cursor
  return new Cursor(stream);
}

Обратите внимание, что размер вашего FrameworkElement должен быть стандартным размером курсора (например, 16x16 или 32x32), например:

<Grid x:Name="customCursor" Width="32" Height="32">
  ...
</Grid>

It будет использоваться следующим образом:

someControl.Cursor = ConvertToCursor(customCursor, new Point(0.5, 0.5));

Очевидно, ваш FrameworkElement может быть элементом управления , если у вас есть существующее изображение, или вы можете рисовать что угодно, используя встроенные инструменты рисования WPF.

Обратите внимание, что подробную информацию о формате файла .cur можно найти в ICO (формат файла) .

16
ответ дан 26 November 2019 в 19:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: