none
Koordinaten eines UIElements nach Transformation RRS feed

  • Frage

  • Hallo zusammen,

    ich habe da eine einfach Frage auf die ich keine rechte Antwort weiß im bezug auf Koordinaten eines UIelements nach einer Transformation.

    Wenn ich bspw. ein UIelement mit RotateTransform verändert habe, wie bekomme ich nun die linke obere Ecke als Koordinate?

    Ich denke es geht irgendwie anhand der Umwandlung mit TransformToAncestor oder so, bin mir aber nciht sicher wie genau..

    Nochmal im Klartext:

    - Rotation eines UIelements

    - Nun hätte ich gerne die neue X/Y Koordinate der linken oberen Ecke

     

    Vielen Dank schonmal für die Hilfe!

     

    Gruß,

    Tyralion

    Dienstag, 4. Mai 2010 16:11

Antworten

  • Ich berechne die Position einfach über die Transformationsmatrix. Nachfolgen ein Beispiel eines Rechtecks, welche in einem im Canvas vorgegebenem Bereich gedreht wird.

    XAML:

    <Window x:Class="MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525"
        xmlns:my="clr-namespace:WpfApplication1">
     <Window.Resources>
      <my:ViewModel x:Key="vm" />
     </Window.Resources>
     <Canvas Name="cv">
      <Button Canvas.Left="100" Canvas.Top="10" Content="Rotate" Click="Button_Click" />
      <Line X1="200" Y1="100" X2="10" Y2="10" Stroke="Blue" StrokeThickness="1"/>
      <Line X1="0" Y1="100" X2="300" Y2="100" Stroke="Black" StrokeThickness="1"/>
      <Rectangle Name="rec" Canvas.Left="200" Canvas.Top="100" Width="30" Height="20" Fill="Red" />
     </Canvas>
    </Window>

    Dazu der Codebehind:

    Imports System.Collections.ObjectModel
    
    Class MainWindow
    
     Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
      Dim p1 = rec.TranslatePoint(New Point(0, 0), cv)
      Dim trans As New RotateTransform(45, 0, 0)
      rec.LayoutTransform = trans
      Dim p2 = rec.LayoutTransform.Transform(New Point(0, rec.Height))
      Dim l As New Line
      With l
       .X1 = 300
       .Y1 = 10
       .X2 = 200 - p2.X
       .Y2 = 100
       .Stroke = New SolidColorBrush(Colors.Red)
       .StrokeThickness = 1
      End With
      cv.Children.Add(l)
     End Sub
    
    End Class
    --
    Peter
    Mittwoch, 5. Mai 2010 07:58