不使用WinForms

时间:2016-08-24 12:53:56

标签: c# wpf xaml mouse-cursor

是否可以轮播FrameworkElement.Cursor

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

Mouse cursor not affected by transform

我的第一个想法是将RotateTransform应用于Cursor属性,但看起来我们无法在XAML中执行此操作。接下来我尝试从Cursor类继承,但看起来MS家伙有sealed

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

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

1 个答案:

答案 0 :(得分: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" />

  3. 在resize thumb中添加以下代码:

    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的{​​{1}},因为它已经是调整大小拇指的一部分,因此会自动获取父控件的角度。

    希望这可以帮助人们继续前进。