Вращение курсора без использования WinForms
Можно ли повернуть FrameworkElement.Cursor
?
Мое приложение позволяет пользователю вращать объекты вокруг своего центра. После поворота курсоры изменения размера по умолчанию кажутся неуклюжими поверх наклонных границ.
Моей первой мыслью было применить RotateTransform
к свойству Cursor, но похоже, что мы не можем сделать это в XAML. Затем я попытался наследовать от Cursor
класс, но, похоже, ребята из MS sealed
Это.
Другой способ - установить курсор по умолчанию на None
и использовать мое собственное изображение (с преобразованием) и установить его положение на MouseMove
, Я не хочу идти по этому пути, если есть более легкие альтернативы. Кто-нибудь с хорошим предложением?
Я ищу решение только для WPF, если это вообще возможно.
1 ответ
Наконец-то удалось это сделать в рамках WPF, без использования WinForms или PInvokes. Вместо создания пользовательских курсоров (*.cur) на лету или конвертации Visual
с курсорами, я использовал MouseMove
событие родительского элемента управления вместе с элементом WPF (Path
) как мой курсор. Вот способ на случай, если кто-то заинтересован:
- Установить
Cursor
вашего большого пальца изменения размера (или что вы используете в качестве границы вашей фигуры), чтобыNone
, так что WPF не отображает стрелку по умолчанию. Создайте свой собственный курсор. Может быть любой
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
в любом месте кода, поскольку он уже является частью большого пальца изменения размера и, следовательно, автоматически получает угол родительского элемента управления.
Надеюсь, что это поможет людям в будущем.