#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;