WPF - Verschieben von Elementen?

  • WPF

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

    Hallo zusammen,

    kann mir jemand sagen, wie man in WPF ein Label an der Stelle einfügt, wo man mit der Maus
    geklickt hat? Anders als in WinForms gibt es da Padding, Margin , uvm.
    Ich blick da nicht mehr durch :wacko: ?!
    Wie kann man eine zur Laufzeit erstellte Textbox an der Stelle einfügen, wo
    man mit der Maus geklickt hat?
    Und wie kann man in WPF einen Verschiebevorgang für ein Image realisieren :?:
    Habe schon in Google gesucht. Ich komme mit den neuen Funktionen nicht klar ...

    VisualBasic-Frager



    Edit by LaMa5:
    -->*moved* (Hauptforum => WPF & Co)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    Weiß ich auch nicht, wie das geht.

    Aber hab grad heut morgen eine Empfehlung einer wirklichen Koryphäe aufgeschnappt und downgeloadet, und fund darin auch ein Kapitel über DragnDrop mittels AttachedProperties.
    prefiles.com/qftuks0u4za9/Sams…nt.Unleashed.Sep.2009.rar

    Gelesen habsich noch nicht, weil mein englisch ist miserable.
    Hallo,

    mit folgendem Code kann mann die Mosueposition auf einem Grid ermitteln:

    VB.NET-Quellcode

    1. Private Sub Grid1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Grid1.MouseMove
    2. Me.Title = CStr(e.GetPosition(Grid1).X) & ":" & CStr(e.GetPosition(Grid1).Y)
    3. End Sub


    die positionierung kann mann so vornehmen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    2. If Button1.Content Is "Button" Then
    3. Button1.Content = "Button1"
    4. Label1.Margin = New Thickness(99, 74, 0, 0) 'Margin(Left,Top,Right,Bottom) auf dem Grid
    5. Else
    6. Button1.Content = "Button"
    7. Label1.Margin = New Thickness(79, 54, 20, 20) 'Margin(Left,Top,Right,Bottom) auf dem Grid
    8. End If
    9. End Sub

    XML-Quellcode

    1. <Window x:Class="MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. Title="MainWindow" Height="350" Width="525">
    5. <Grid Name="Grid1">
    6. <Label Content="Label" Height="105" HorizontalAlignment="Left" Margin="99,74,0,0" Name="Label1" VerticalAlignment="Top" Width="192" />
    7. <Button Content="Button" Height="47" HorizontalAlignment="Left" Margin="337,160,0,0" Name="Button1" VerticalAlignment="Top" Width="111" />
    8. </Grid>
    9. </Window>
    10. mfG
    11. Derfuhr
    âh - grad klingelts bei mir - attachedProperties!

    Natürlich täte man so mausbezogene Positioniereungen auffm Canvas-Control vornehmen - nicht auffm Grid or whatever. Controls, die auf einem Canvas positioniert werden haben ja die attachedProperties Left und Top.
    Also eine MVVM-mäßige Lösung wäre ein ItemsControl mit einem Canvas als ItemsPanel. Und wenn man da draufklickst müsste im ViewModel ein neuer Datensatz angelegt werden, mit den Properties Text, Left und Top.
    Ferner gäbe es ein DataTemplate für die Items, dass derlei Datensätze durch eine Textbox dargestellt würden, deren Text an den Text, und Left und Top an Left und Top des Datensatzes gebunden wäre - fertig.

    Alles klar? ;)
    Für solche Dinge verwendet man immer ein Canvas. Ähnlich wie beim Grid gibt es auch hier AttachedProperties welche ausgewertet werden.
    Wenn du das Zeug verschieben möchtest gibt es auch noch Dinge wie z.b. msdn.microsoft.com/de-de/libra…ior(v=expression.40).aspx.
    Du kannst deinen Elementen dieses Behaviour geben, und du wirst sie per Mouse verschieben können.

    Außerdem empfiehlt sich auch für das platzieren der Controls eine AttachedProperty zu schreiben. Dadurch bleibt dein Codebehind weiterhin leer und das Ganze ist sehr einfach wiederverwendbar und wesentlich übersichtlicher. Dazu passt es perfekt zu mvvm.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.