c# - 不使用 WinForms 旋转光标

标签 c# wpf xaml mouse-cursor

是否可以旋转 FrameworkElement.Cursor

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

Mouse cursor not affected by transform

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

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

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

最佳答案

最终在 WPF 范围内管理它,而不使用 WinForms 或 PInvokes。而不是即时创建自定义游标 (*.cur) 或转换 Visual s 变成游标,我用了 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代码中的任何位置,因为它已经是调整大小拇指的一部分,因此会自动获取父控件的角度。

希望这对以后的人有所帮助。

关于c# - 不使用 WinForms 旋转光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39123912/

相关文章:

wpf - 在设计器中看不到图像

python - IronPython与WPF编译exe pyc错误

c# - CheckBox、IsChecked == false 不起作用

c# - Sql、Wpf、Xaml、C#、绑定(bind)数据、动态资源、访问非静态数据、获取对象引用

c# - .NET 的 JavaScriptSerializer.Deserialize() 忽略来自 JSON 的数字中的小数点

c# - 单元测试依赖注入(inject)

c# - 在 Windows 资源管理器中将文件从(例如)iPhone 拖放到 WPF 应用程序中

c# - 使用 Dapper 水化复杂对象

c# - WPF/XAML VisualStateManager 谁处理事件?

c# - 如何使用 c# 和 Xaml 引用在 Windows 8 应用程序中的每个组之前重复的相同按钮?