【问题标题】:Rotating cursor without using WinForms不使用 WinForms 旋转光标
【发布时间】:2016-12-31 14:59:19
【问题描述】:

FrameworkElement.Cursor可以旋转吗?

我的应用程序允许用户围绕其中心旋转对象。旋转后,默认调整大小的光标在倾斜的边框顶部会显得很尴尬。

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

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

如果可能的话,我正在寻找仅 WPF 的解决方案。

【问题讨论】:

  • @FirstStep:正如该答案的 cmets 中已经指出的那样,该代码中有几个错误。此外,它使用 WinForms 库;除非没有其他办法,否则我想避免的事情。
  • 对我来说,这是两个问题之间的合理区别。我不认为这需要作为副本关闭。
  • 我希望 MS 将 Cursor 类作为安全问题进行密封。我可以想象如果您可以从Cursor 继承,那么记录鼠标甚至控制鼠标会容易得多。不完全有帮助,但值得深思。
  • @MikeEason:不确定这怎么可能。 Cursor 类不控制鼠标位置或任何其他鼠标功能。它只是控制指针的视觉外观。

标签: c# wpf xaml mouse-cursor


【解决方案1】:

最终在 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);
}

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

希望这对未来的人们有所帮助。

【讨论】:

  • 删除了我的评论。我发现我可以在路径上使用 RotateTransform 来获得所需的光标方向。唯一的问题是我还在 Canvas 上使用了 ScaleTransform,它也可以缩放我的光标。目前正在尝试应用 Inverse 使其看起来不错。感谢您提供正确方向的提示。
猜你喜欢
  • 2012-08-04
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 2011-02-19
  • 1970-01-01
  • 2013-04-14
相关资源
最近更新 更多