2016-08-24 37 views
5

Czy można obrócić FrameworkElement.Cursor?Obracanie kursora bez użycia WinForms

Moja aplikacja umożliwia obracanie obiektów wokół ich centrum. Po obróceniu domyślne kursory zmiany rozmiaru pojawiają się niezręcznie na pochylonych krawędziach.

Mouse cursor not affected by transform

Moją pierwszą myślą było zastosowanie RotateTransform do właściwości kursora, ale wygląda na to, że nie można tego zrobić w XAML. Następnie próbowałem dziedziczyć po klasie Cursor, ale wygląda na to, że MS faceci mają sealed to.

Innym sposobem jest ustawienie domyślnego kursora na None i użycie własnego obrazu (z transformacją) i ustawienie jego położenia na MouseMove. Nie chcę iść tą drogą, jeśli istnieją łatwiejsze alternatywy. Ktoś z dobrą sugestią?

Poszukuję rozwiązania typu WPF, jeśli to w ogóle możliwe.

+2

Możliwy duplikat [Obrotowy kursor zgodnie z obróconym polem tekstowym] (http://stackoverflow.com/questions/2835502/rotating-cursor-cordingor-to-rotated-textbox) –

+1

@FirstStep: jak już wspomniano w komentarzach do tej odpowiedzi , ten kod zawiera kilka błędów. Dodatkowo używa bibliotek WinForms; coś, czego chciałbym uniknąć, chyba że nie ma innej drogi. – dotNET

+0

Dla mnie to rozsądna różnica między tymi dwoma pytaniami. Nie sądzę, żeby to musiało być zamknięte jako duplikat. – arbitrarystringofletters

Odpowiedz

0

Wreszcie udało się to w granicach WPF, bez użycia WinForm lub PInvokes. Zamiast tworzyć niestandardowe kursory (* .cur) w locie lub konwertować Visual s na kursory, użyłem MouseMove zdarzenia kontrolki nadrzędnej wraz z elementem WPF (Path) jako moim kursorem. Oto sposób na wszelki wypadek ktoś interesed:

  1. Ustaw Cursor swojego kciuka zmiany rozmiaru (lub cokolwiek używasz do granicy kształtu) do None, tak że WPF nie wyświetla domyślną strzałkę.
  2. Utwórz własny kursor. Może to być dowolny FrameworkElement, ale użyłem Path do łatwej manipulacji, aby utworzyć dowolny kształt. Zwróć uwagę, że większość właściwości, które ustawiłem poniżej, jest ważna.

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

Dodaj następujący kod w swoim zmiany rozmiaru kciuka:

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

pamiętać, że nie zostały ustawione RotateTransform mojego Path gdziekolwiek w kodzie, ponieważ jest już częścią kciuk zmiany rozmiaru, a tym samym automatycznie przejmuje kąt kontroli rodzica.

Mam nadzieję, że to pomoże ludziom zejść z drogi.