Отображать пользовательский курсор в приложении WPF

#wpf #vb.net #mouse-cursor

#wpf #vb.net #курсор мыши

Вопрос:

У меня есть набор курсоров (.cur-файлы), которые я хочу использовать с моим приложением WPF / VB.net, без изменения курсоров в масштабах всей системы. Я предполагаю, что я бы каким-то образом использовал свойство «cursor» каждого объекта WPF, но я не уверен, как использовать мои собственные курсоры.

Что я должен сделать для достижения этой цели?

Ответ №1:

Вы пробовали использовать перегрузку пути к файлу для создания курсора?

 Cursor cursor = new Cursor("<path>");
  

Или поток, если уж на то пошло?

Как только у вас есть объект cursor, вы можете назначить его элементам управления, где он должен отображаться. ( FrameworkElement.Cursor )


Если вы используете курсор в качестве ресурса, например, в папке cursors в вашем проекте

экран

вы можете ссылаться на него в любом месте вашего XAML, например

 <Window Cursor="Cursors/wait_il.cur">...
  

Комментарии:

1. Хм, я могу видеть, как код может работать, но мне нужен некоторый контекст для этого. КУДА мне поместить каждый из этих фрагментов? Я пробовал несколько вариантов, но продолжаю получать исключения.

2. @JasonMc92: Смотрите мой обновленный ответ о самом простом способе сделать это.

Ответ №2:

предполагая, что курсор находится в папке /Resources / и для действия сборки установлено значение Resource:

объявить:

 <TextBlock x:Key="MyCursor" Cursor="/Resources/grab.cur" />
  

Затем применить к главному окну в инициализаторе:

 this.Cursor = (FindResource("MyCursor") as TextBlock).Cursor;
  

Комментарии:

1. Что это, черт возьми, за бессмысленный взлом? Почему бы не назначить его самому окну в первую очередь?

2. по всей системе, я думаю, он имеет в виду приложение в целом? новый курсор (<путь>) выдавал исключение для меня, потому что ему нужен был абсолютный путь. Чтобы избежать использования кода, я разрешаю текстовому блоку создавать курсор, поскольку текстовый блок крошечный. Это хакерски, да, но стабильно. Но да, он может написать код, чтобы получить текущий путь к программе, прочитать файл курсора или что-то еще, если захочет.

Ответ №3:

Хорошо, поскольку H.B угрожал мне, вот класс: p

 public class CustomCursor
{
    private System.Windows.Input.Cursor _cursor = null;
    public System.Windows.Input.Cursor Cursor
    {
        get
        {
            if (_cursor == null)
                _cursor = GetCursor();
            return _cursor;
        }
    }

    public string RelativePath { get; set; }

    public CustomCursor()
    {
    }

    public CustomCursor(string relativePath)
    {
        RelativePath = relativePath;
    }

    public System.Windows.Input.Cursor GetCursor()
    {
        if (RelativePath == null)
            throw new ArgumentNullException("You must set RelativePath first");

        string directory = Directory.GetCurrentDirectory();
        string absPath = directory   '\'   RelativePath;

        if (!File.Exists(absPath))
            throw new FileNotFoundException();

        return new System.Windows.Input.Cursor(absPath);
    }
}
  

Использовать в коде, лежащем в основе, вот так:

 this.Cursor = new CustomCursor("grab.cur").Cursor;
  

Или объявить в xaml:

 <local:CustomCursor x:Key="MyCursor" RelativePath="grab.cur"/>
  

И ссылаться вот так:

 this.Cursor = (FindResource("MyCursor") as CustomCursor).Cursor;