Вращение курсора без использования WinForms

Можно ли повернуть FrameworkElement.Cursor?

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

Курсор мыши не зависит от преобразования

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

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

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

1 ответ

Решение

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

  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 в любом месте кода, поскольку он уже является частью большого пальца изменения размера и, следовательно, автоматически получает угол родительского элемента управления.

Надеюсь, что это поможет людям в будущем.

Другие вопросы по тегам