WPF - GDI+ Zeichnen

  • Allgemein

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von (Ger)Foley.

    WPF - GDI+ Zeichnen

    Hi,

    weiß jemand, wie man in WPF auch mit GDI zeichnen kann?
    Ich habe hier einen Code ( WinForms )

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim thread As New Threading.Thread(AddressOf drawing)
    3. Dim gebäudes As New List(Of Gebäude)
    4. Sub drawing()
    5. Dim xs As Integer = 0
    6. Do
    7. Select Case xs
    8. Case 0
    9. gebäudes.Add(New Gebäude(0, New Point(0, 0), Brushes.Red, "", New List(Of Point)({}), 0))
    10. xs += 1
    11. Case 1
    12. gebäudes.Add(New Gebäude(0, New Point(1, 0), Brushes.Red, "", New List(Of Point)({New Point(0, 0)}), 0))
    13. xs += 1
    14. Case 2
    15. gebäudes.Add(New Gebäude(0, New Point(0, 1), Brushes.Red, "", New List(Of Point)({New Point(0, 0), New Point(1, 0)}), 0))
    16. xs += 1
    17. Case 3
    18. gebäudes.Add(New Gebäude(0, New Point(1, 1), Brushes.Red, "", New List(Of Point)({New Point(0, 0), New Point(0, 1), New Point(1, 0)}), 0))
    19. xs += 1
    20. End Select
    21. Me.Invalidate()
    22. Threading.Thread.Sleep(250)
    23. Loop
    24. End Sub
    25. Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    26. thread.Abort()
    27. End Sub
    28. Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    29. thread.Start()
    30. End Sub
    31. Private Sub Form1_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint
    32. Dim g = e.Graphics
    33. g.FillRectangle(Brushes.Gray, New Rectangle(0, 0, Me.Width, Me.Height))
    34. For x = 0 To gebäudes.Count - 1
    35. For Each item In gebäudes(x).requires
    36. g.DrawLine(Pens.Black, gebäudes(x).pos.X * 100 + 75, gebäudes(x).pos.Y * 100 + 75, item.X * 100 + 75, item.Y * 100 + 75)
    37. Next
    38. Next
    39. For x = 0 To gebäudes.Count - 1
    40. g.FillRectangle(gebäudes(x).color, gebäudes(x).pos.X * 100 + 50, gebäudes(x).pos.Y * 100 + 50, 50, 50)
    41. Next
    42. End Sub
    43. End Class
    44. Class Gebäude
    45. Dim _type As Integer
    46. Dim _pos As Point
    47. Dim _color As Brush
    48. Dim _text As String
    49. Dim _requires As New List(Of Point)
    50. Dim _level As Integer
    51. Public ReadOnly Property type As Integer
    52. Get
    53. Return _type
    54. End Get
    55. End Property
    56. Public ReadOnly Property pos As Point
    57. Get
    58. Return _pos
    59. End Get
    60. End Property
    61. Public ReadOnly Property color As Brush
    62. Get
    63. Return _color
    64. End Get
    65. End Property
    66. Public ReadOnly Property text As String
    67. Get
    68. Return _text
    69. End Get
    70. End Property
    71. Public ReadOnly Property requires As List(Of Point)
    72. Get
    73. Return _requires
    74. End Get
    75. End Property
    76. Public ReadOnly Property level As Integer
    77. Get
    78. Return _level
    79. End Get
    80. End Property
    81. Sub New(ByVal type As Integer, ByVal pos As Point, ByVal color As Brush, ByVal text As String, ByVal requires As List(Of Point), ByVal level As Integer)
    82. _type = type
    83. _pos = pos
    84. _color = color
    85. _text = text
    86. _requires = requires
    87. _level = level
    88. End Sub
    89. End Class


    So...nur leider gibts das in WPF nicht mehr...
    wie kann ich das nun nach WPF umschreiben?
    Hi.

    Rechtecke und Linien kannst du statisch (im XAML) oder dynamisch (im Code-Behind) definieren. Da du mehrere Gebäude zeichnen willst, solltest du die dynamische Variante wählen. Hier ist ein Beispiel für ein Rechteck. Du musst nur die Eigenschaften entsprechend festlegen und das Objekt wie "früher" in eine Art "ControlCollection" einfügen. Was das genau bedeutet, siehst du im verlinkten Beispiel.
    Gruß
    hal2000
    Doch - Canvas ist dazu da, dass man der Inhalte Positionen bestimmt.

    Ich glaub, Konzeptionell würde man unter WPF ungefähr in diese Richtung vorgehen:

    nimm ein ListControl, und setze als ItemsPanel ein Canvas ein.

    Dann schreibe Gebäude-Klassen, die ihre Positionen kennen.

    Davon eine Liste ans ListControl.ItemsSource binden

    für die ListboxItems kann man dann ein DataTemplate basteln, und dessen Position an die Gebäudeklassen binden.

    So die Richtung.

    Genau kannichdir das auch nicht vorsagen, weilichauch Wpf-Anfänger bin.
    hmm...okay...also..ich habe schonmal eine..naja....schlechte lösung gefunden:

    VB.NET-Quellcode

    1. Class MainWindow
    2. Sub draw()
    3. Dim rectangle As New Rectangle
    4. rectangle.Width = 50
    5. rectangle.Height = 50
    6. Dim myBrush As SolidColorBrush = New SolidColorBrush(Colors.Red)
    7. rectangle.Fill = myBrush
    8. rectangle.Margin = New Thickness(5)
    9. canvas.Children.Insert(0, rectangle)
    10. End Sub
    11. Private Sub MainWindow_Loaded(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles Me.Loaded
    12. draw()
    13. End Sub
    14. End Class

    Mit Margin...aber da ich immer vier Positionen angeben muss...is das etwas dämlich...aber ich glaube, damit kann ich leben^^

    //Edit: hmm...ich kann aber nicht mehrere gleichzeitig zeichnen...

    VB.NET-Quellcode

    1. rectangle.Margin = New Thickness(5, 5, 0, 0)
    2. canvas.Children.Insert(0, rectangle)
    3. rectangle.Margin = New Thickness(52, 5, 0, 0)
    4. canvas.Children.Insert(1, rectangle)
    geht nicht....
    Verstehe deine logik nicht ganz.Kann dir nur mein 3DEngine mit Viewport geben.(Auf Nachfrage,sehr gutes Engine für viewport Beginner)
    Du kannst allerdings folgendes.

    XML-Quellcode

    1. <Canvas>
    2. <Rectangle Name="Bla" />
    3. <Rectangle Name="Blabla />
    4. </Canvas>

    VB.NET-Quellcode

    1. Sub BlaBlaBla() Handles Me.Loaded
    2. Rectangle.Height = "Wasdubrauchst"
    3. Rectangle.Width = "Wasdunochbrauchst"
    4. 'Rectangle.irgendeineeigenschaft
    5. End Sub

    als Grundgerüst nehmen und dir damit deine Gebäude basteln.
    Man weihe mich ein was ist das???Nimm ein ListView Object Mit OpacityEffekt.In den Berecih der ListView fügst du ein Canvas "leinwand" ein:
    Das wars damit stehen dir von Image über GDI bis Viewport alles zur Verfügung was du brauchst.