2016-08-24 3 views
5

Ist es möglich, FrameworkElement.Cursor zu drehen?Drehender Cursor ohne WinForms

Meine Anwendung ermöglicht Benutzern, Objekte um ihre Mitte zu drehen. Nach der Drehung erscheinen die standardmäßigen Größencursor auf den geneigten Rahmen unbeholfen.

Mouse cursor not affected by transform

Mein erster Gedanke war RotateTransform auf die Cursor-Eigenschaft anzuwenden, aber es sieht aus wie wir nicht, dass in XAML tun. Als nächstes habe ich versucht, von Cursor Klasse zu erben, aber es sieht aus wie MS Jungs haben sealed es.

Eine andere Möglichkeit ist, den Standard-Cursor auf None zu setzen und mein eigenes Bild (mit Transformation) zu verwenden und seine Position auf MouseMove zu setzen. Ich bin nicht bereit, diesen Weg zu gehen, wenn es leichtere Alternativen gibt. Jeder mit einem guten Vorschlag?

Ich suche nach einer WPF-only-Lösung, wenn überhaupt möglich.

+2

Mögliches Duplikat von [Drehender Cursor nach gedrehter TextBox] (http://stackoverflow.com/questions/2835502/rotating-cursor-according-to-rotated-textbox) –

+1

@FirstStep: Wie bereits in den Kommentaren dieser Antwort erwähnt Dieser Code enthält mehrere Fehler. Zusätzlich verwendet es WinForms Bibliotheken; etwas, das ich gerne vermeiden würde, wenn es keinen anderen Weg gibt. – dotNET

+0

Für mich ist das eine vernünftige Unterscheidung zwischen den beiden Fragen. Ich denke nicht, dass dies als Duplikat geschlossen werden muss. – arbitrarystringofletters

Antwort

0

Schließlich verwaltet es innerhalb der Grenzen von WPF, ohne WinForms oder PInvokes zu verwenden. Anstatt benutzerdefinierte Cursors (* .cur) im laufenden Betrieb zu erstellen oder Visual s in Cursor zu konvertieren, habe ich das MouseMove-Ereignis des übergeordneten Steuerelements zusammen mit einem WPF-Element (Path) als Cursor verwendet. Hier ist der Weg nur für den Fall jemand interesed ist:

  1. die Cursor Ihren Resize Daumen Set (oder was auch immer Sie verwenden als die Grenze Ihrer Form) zu None, so dass WPF nicht Standard-Pfeil angezeigt.
  2. Erstellen Sie Ihren eigenen Cursor. Könnte irgendein FrameworkElement sein, aber ich habe Path für seine einfache Manipulation benutzt, um jede Form zu schaffen, die Sie wollen. Beachten Sie, dass die meisten Eigenschaften, die ich unten eingestellt habe, wichtig sind.

    <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" />

Fügen Sie den folgenden Code in Ihr Resize Daumen:

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); 
} 

Bitte beachte, dass ich nicht RotateTransform meiner Path irgendwo im Code festgelegt haben, da es bereits gehört Der Daumen wird verkleinert und erhält automatisch den Winkel der übergeordneten Steuerung.

Hoffe das hilft Menschen auf der Straße.

Verwandte Themen