Linie auf Canvas zeichnen mit X-Position Mauscursor

  • WPF MVVM
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von kafffee.

    Linie auf Canvas zeichnen mit X-Position Mauscursor

    Neu

    Hallo miteinander :)

    Ich hab folgendes Szenario:

    Spoiler anzeigen

    XML-Quellcode

    1. <Grid Margin="20">
    2. <Grid.RowDefinitions>
    3. <RowDefinition Height="10*"/>
    4. <RowDefinition Height="50*"/>
    5. <RowDefinition Height="10*"/>
    6. <RowDefinition Height="50*"/>
    7. </Grid.RowDefinitions>
    8. <Canvas ClipToBounds="True" Grid.Row="1" Margin="10, 10, 10, 10">
    9. <u:DataPiping.DataPipes>
    10. <u:DataPipeCollection>
    11. <u:DataPipe Source="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualWidth}"
    12. Target="{Binding Path=WFBreite, Mode=OneWayToSource}"/>
    13. <u:DataPipe Source="{Binding RelativeSource={RelativeSource AncestorType={x:Type Canvas}}, Path=ActualHeight}"
    14. Target="{Binding Path=WFHoehe, Mode=OneWayToSource}"/>
    15. </u:DataPipeCollection>
    16. </u:DataPiping.DataPipes>
    17. <Image Name="imgWF" Source="{Binding WaveForm, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" Canvas.Top="0" Canvas.Left="0" MouseMove="imgWF_MouseMove" MouseLeftButtonDown="imgWF_MouseLeftButtonDown"/>
    18. <Line Stroke="Red" StrokeThickness="2" Y1="0" Y2="{Binding ActualHeight, ElementName=imgWF, UpdateSourceTrigger=PropertyChanged}" X1="{Binding MovingXPosWF, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" X2="{Binding MovingXPosWF, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
    19. <Line Stroke="Red" StrokeThickness="2" Y1="0" Y2="{Binding ActualHeight, ElementName=imgWF, UpdateSourceTrigger=PropertyChanged}" X1="{Binding ClickedXPosWF, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" X2="{Binding ClickedXPosWF, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"/>
    20. </Canvas>


    VB.NET-Quellcode

    1. Private Sub imgWF_MouseMove(sender As Object, e As MouseEventArgs)
    2. Dim vm = CType(Me.DataContext, RecordingVinylsViewModel)
    3. Dim MausPosition = e.GetPosition(Me)
    4. vm.MovingXPosWF = MausPosition.X
    5. End Sub
    6. Private Sub imgWF_MouseLeftButtonDown(sender As Object, e As MouseButtonEventArgs)
    7. Dim vm = CType(Me.DataContext, RecordingVinylsViewModel)
    8. Dim MausPosition = e.GetPosition(Me)
    9. vm.ClickedXPosWF = MausPosition.X
    10. End Sub


    VB.NET-Quellcode

    1. Private _MovingXPosWF As Double
    2. Public Property MovingXPosWF As Double
    3. Get
    4. Return _MovingXPosWF
    5. End Get
    6. Set(value As Double)
    7. _MovingXPosWF = value
    8. RaisePropertyChanged()
    9. End Set
    10. End Property
    11. Private _ClickedXPosWF As Double
    12. Public Property ClickedXPosWF As Double
    13. Get
    14. Return _ClickedXPosWF
    15. End Get
    16. Set(value As Double)
    17. _ClickedXPosWF = value
    18. RaisePropertyChanged()
    19. End Set
    20. End Property
    21. Private _WaveForm As BitmapSource
    22. Public Property WaveForm As BitmapSource
    23. Get
    24. Return _WaveForm
    25. End Get
    26. Set(value As BitmapSource)
    27. _WaveForm = value
    28. RaisePropertyChanged()
    29. End Set
    30. End Property


    Nun möchte ich an der aktuellen Mauscursorposition eine, bzw. zwei rote Linien setzen, eine wenn sich die Maus bewegt, die andere wenn man klickt. Funktioniert auch soweit bis auf den Fakt, dass die Linien immer ca. 1 cm rechts vom Mauscursor erscheinen und ich hab keinen blassen Schimmer wieso. Bildschirmskalierung ist bei 100%, aber das Problem tritt auch bei anderen Skalierungen auf. Hat jemand eine Idee warum? Hab auch schon probiert, den Margin des Canvas auf 0 zu setzen.

    Dieses DataPipe-Zeugs überträgt bei mir ActualWidth und ActualHeight auf die Properties im ViewModel.