2016-08-24 3 views
5

Можно повернуть FrameworkElement.Cursor?Вращающийся курсор без использования WinForms

Мое приложение позволяет поворачивать объекты вокруг своего центра. После поворота указатели изменения размера по умолчанию выглядят неудобно поверх наклонных границ.

Mouse cursor not affected by transform

Моя первая мысль была применить RotateTransform к свойству курсора, но, похоже, мы не можем сделать это в XAML. Затем я попробовал наследовать от Cursor класс, но похоже, что у парней MS есть sealed.

Другой способ - установить по умолчанию курсор на None и использовать мое собственное изображение (с преобразованием) и установить его положение на MouseMove. Я не хочу идти по этому пути, если есть более простые альтернативы. Кто-нибудь с хорошим предложением?

Я ищу решение только для WPF, если это вообще возможно.

+2

Возможный дубликат [Вращающийся курсор в соответствии с повернутым текстовым полем] (http://stackoverflow.com/questions/2835502/rotating-cursor-according-to-rotated-textbox) –

+1

@FirstStep: Как уже отмечалось в комментариях этого ответа , этот код содержит несколько ошибок. Кроме того, он использует библиотеки WinForms; чего бы я хотел избежать, если нет другого пути. – dotNET

+0

Для меня это разумное различие между двумя вопросами. Я не думаю, что это нужно закрыть как дубликат. – arbitrarystringofletters

ответ

0

Наконец-то он управлялся им в рамках WPF без использования WinForms или PInvokes. Вместо создания пользовательских курсоров (* .cur) на лету или преобразования Visual s в курсоры я использовал MouseMove событие родительского элемента управления вместе с элементом WPF (Path) в качестве моего курсора. Вот как раз в случае, если кто-то interesed:

  1. Установите Cursor ваше изменение размера большого пальца (или что вы используете в качестве границы вашей формы) к None, так что WPF не отображается по умолчанию стрелка.
  2. Создайте свой собственный указатель. Может быть любой FrameworkElement, но я использовал Path для его легкой обработки, чтобы создать любую форму, которую вы хотите. Обратите внимание, что большинство свойств, которые я установил ниже, важны.

    <Path x:Name="PART_EW" Data="M0,20 L25,0 25,15 75,15 75,0 100,20 75,40 75,25 25,25 25,40z" Fill="White" Stroke="Black" StrokeThickness="1" Visibility="Collapsed" Width="50" Height="20" Opacity=".7" Stretch="Fill" Panel.ZIndex="100001" HorizontalAlignment="Left" VerticalAlignment="Top" IsHitTestVisible="False" />

Добавьте следующий код в изменения размера большого пальца:

protected override void OnMouseEnter(MouseEventArgs e) 
{ 
    base.OnMouseEnter(e); 

    var Pos = e.GetPosition(this); 
    PART_EW.Margin = new Thickness(
         Pos.X - PART_EW.Width/2, 
         Pos.Y - PART_EW.Height/2, 
         -PART_EW.Width, 
         -PART_EW.Height); 
    PART_EW.Visibility = Visibility.Visible; 
} 

protected override void OnMouseLeave(MouseEventArgs e) 
{ 
    base.OnMouseLeave(e); 
    PART_EW.Visibility = Visibility.Collapsed; 
} 

protected override void OnMouseMove(MouseEventArgs e) 
{ 
    base.OnMouseMove(e); 

    var Pos = e.GetPosition(designerItem); 
    PART_EW.Margin = new Thickness(
         Pos.X - PART_EW.Width/2, 
         Pos.Y - PART_EW.Height/2, 
         -PART_EW.Width, 
         -PART_EW.Height); 
} 

Обратите внимание, что я не установил RotateTransform моего Path в коде, так как он уже является частью большой палец размера и, следовательно, автоматически получает угол родительского элемента управления.

Надеюсь, что это поможет людям по дороге.

Смежные вопросы