不使用WinForms旋转光标

dot*_*NET 6 c# wpf xaml mouse-cursor

可以旋转FrameworkElement.Cursor吗?

我的应用程序允许用户围绕其中心旋转对象.旋转后,默认调整大小的光标在倾斜边框上显得很笨拙.

鼠标光标不受变换影响

我的第一个想法是应用于RotateTransformCursor属性,但看起来我们不能在XAML中这样做.接下来我尝试从Cursor类继承,但它看起来像MS家伙拥有sealed它.

另一种方法是将默认光标设置为None并使用我自己的图像(使用变换)并设置其位置MouseMove.如果有更容易的选择,我不愿意走这条路.谁有好的建议?

如果可能的话,我正在寻找一个仅支持WPF的解决方案.

dot*_*NET 6

最终在 WPF 的范围内管理它,而不使用 WinForms 或 PInvokes。我没有即时创建自定义光标 (*.cur) 或将Visuals 转换为光标,而是使用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);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我没有在代码中的任何位置设置RotateTransform我的Path值,因为它已经是调整大小拇指的一部分,因此会自动获取父控件的角度。

希望这对人们有所帮助。