Identischer Code, abgesehen von Benamung funktioniert nicht?

  • WPF
  • .NET 5–6

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    Identischer Code, abgesehen von Benamung funktioniert nicht?

    Moin,

    ich bin gerade auf ein Verhalten gestoßen, wozu ich Hintergund brauche, eigendlich Identische Codes von denen einer eine Exception wirft. Scheinbar gibt es da eine Regel die ich entweder überlesen hab, oder @Nofear23m nicht im Tutorial erwähnt hat.

    Quellcode

    1. Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    2. Fehler XDG0041 Die MouseWheelChangeProperty-Eigenschaft ist kein DependencyProperty-Objekt. Zur Verwendung in Markup müssen nicht angefügte Eigenschaften im Zieltyp mit einer MouseWheelChangeProperty-Instanzeigenschaft verfügbar gemacht werden, auf die zugegriffen werden kann. Für angefügte Eigenschaften muss der deklarierende Typ die statischen Methoden "GetMouseWheelChangeProperty" und "SetMouseWheelChangeProperty" bereitstellen.

    Der Designer zeigt dann "Ungültiges Markup", aber das Projekt kann kompiliert werden und die Anwendung funktioniert.

    Mit Fehler

    VB.NET-Quellcode

    1. Public Class SliderMouseWheel
    2. Inherits DependencyObject
    3. Public Shared ReadOnly MouseWheelChange As DependencyProperty = DependencyProperty.RegisterAttached("MouseWheelChangeProperty", GetType(Double), GetType(SliderMouseWheel), New PropertyMetadata(New PropertyChangedCallback(AddressOf MouseWheelChangeChanged)))
    4. Private Shared Sub MouseWheelChangeChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    5. Dim slider As Slider = DirectCast(d, Slider)
    6. AddHandler slider.MouseWheel, AddressOf OnMouseWheel
    7. End Sub
    8. Private Shared Sub OnMouseWheel(sender As Object, e As MouseWheelEventArgs)
    9. Dim slider As Slider = DirectCast(sender, Slider)
    10. Dim sliderValue = slider.Value
    11. Dim change As Double = DirectCast(slider.GetValue(MouseWheelChange), Double)
    12. If e.Delta > 0 Then
    13. sliderValue += change
    14. ElseIf e.Delta < 0 Then
    15. sliderValue -= change
    16. End If
    17. slider.Value = Clamp(sliderValue, slider.Minimum, slider.Maximum)
    18. End Sub
    19. Private Shared Function Clamp(value As Double, min As Double, max As Double) As Double
    20. If value < min Then value = min
    21. If value > max Then value = max
    22. Return value
    23. End Function
    24. Public Shared Sub SetMouseWheelChangeProperty(uiElement As UIElement, value As Double)
    25. uiElement.SetValue(MouseWheelChange, value)
    26. End Sub
    27. Public Shared Function GetMouseWheelChangeProperty(uiElement As UIElement) As Double
    28. Return DirectCast(uiElement.GetValue(MouseWheelChange), Double)
    29. End Function
    30. End Class

    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. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfApp1"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Window.Resources>
    10. <Style TargetType="{x:Type Slider}">
    11. <Setter Property="local:SliderMouseWheel.MouseWheelChangeProperty" Value="1"/>
    12. </Style>
    13. </Window.Resources>
    14. <Grid>
    15. <Slider Minimum="0" Maximum="100" />
    16. </Grid>
    17. </Window>



    Dieser Code hier ist soweit das selbe(funktioniert tadellos), einziger unterschied, die Property wird nun nicht mit Propertynamen mit "Property" am Ende ist registriert, dafür habe ich das an den Namen der DependencyProperty-Variable angehängt, dazu auch die Get und Set Methoden entsprechend umbenannt.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class SliderMouseWheel
    2. Public Shared ReadOnly MouseWheelChangeProperty As DependencyProperty = DependencyProperty.RegisterAttached("MouseWheelChange", GetType(Double), GetType(SliderMouseWheel), New PropertyMetadata(AddressOf MouseWheelChangeChanged))
    3. Private Shared Sub MouseWheelChangeChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
    4. Dim slider As Slider = DirectCast(d, Slider)
    5. AddHandler slider.MouseWheel, AddressOf OnMouseWheel
    6. End Sub
    7. Private Shared Sub OnMouseWheel(sender As Object, e As MouseWheelEventArgs)
    8. Dim slider As Slider = DirectCast(sender, Slider)
    9. Dim sliderValue = slider.Value
    10. Dim change As Double = DirectCast(slider.GetValue(MouseWheelChangeProperty), Double)
    11. If e.Delta > 0 Then
    12. sliderValue += change
    13. ElseIf e.Delta < 0 Then
    14. sliderValue -= change
    15. End If
    16. slider.Value = Clamp(sliderValue, slider.Minimum, slider.Maximum)
    17. End Sub
    18. Private Shared Function Clamp(value As Double, min As Double, max As Double) As Double
    19. If value < min Then value = min
    20. If value > max Then value = max
    21. Return value
    22. End Function
    23. Public Shared Sub SetMouseWheelChange(uiElement As uiElement, value As Double)
    24. uiElement.SetValue(MouseWheelChangeProperty, value)
    25. End Sub
    26. Public Shared Function GetMouseWheelChange(uiElement As UIElement) As Double
    27. Return DirectCast(uiElement.GetValue(MouseWheelChangeProperty), Double)
    28. End Function
    29. End Class

    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. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:WpfApp1"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Window.Resources>
    10. <Style TargetType="{x:Type Slider}">
    11. <Setter Property="local:SliderMouseWheel.MouseWheelChange" Value="1"/>
    12. </Style>
    13. </Window.Resources>
    14. <Grid>
    15. <Slider Minimum="0" Maximum="100" />
    16. </Grid>
    17. </Window>



    Weshalb mag der Designer den ersten Code nicht? Klar macht die 2. Variante mehr sinn, weil im Xaml sieht es einfach **** aus, wenn man das so überall macht(wie variante 1) und Property am Ende jedes Propertynamens hat.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()

    Der 2. Code ist ja der welcher funktioniert. @Bluespide, du meinst so?
    Public Shared ReadOnly MouseWheelChange As DependencyProperty = DependencyProperty.RegisterAttached("MouseWheelChange", GetType(Double), GetType(SliderMouseWheel), New PropertyMetadata(AddressOf MouseWheelChangeChanged))
    Dann habe ich die gleiche Fehlermeldung wie beim 1. Code.

    Ich denke wegen des gleichen Namens kann dann nicht mehr richtig unterschieden werden. Weil wir in den Methoden für get und set, so drauf zugreifen.
    uiElement.SetValue(MouseWheelChange, value)
    uiElement.GetValue(MouseWheelChange)
    Via Name der DP-Variable, nicht der von der registrierung, den von der Registrierung nutzen wir im XAML, den von Namen der Registrierung müssen wir für die Get und Set Methode nehmen. Get/Set+Registrierter Name
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „DTF“ ()

    tja, so ist einfach die Konvention: das DependencyProperty-Objekt muss blablaProperty heissen, wenn die Property blabla heissen soll.
    puh - woher ich das weiss - habich vergessen.

    Ist ja das gleiche wie mit den anderen Konventionen: die Shared Function muss GetBlabla() heissen, wenn die Property Blabla heissen soll.
    (SetBlaBla dito)
    Hab mir nun noch einmal Teile vom Tutorial angeschaut, Nofear23fm hat das doch erwähnt, aber in einem Kapitel, das ich nicht gelesen hatte. Das mit der Ellipse(2.1.5.2), das hatte ich ausgespart.

    Aber auch bei MS habe ich nochmal gelesen und wurde auch fündig:
    learn.microsoft.com/de-de/dotn…rview?view=netdesktop-7.0
    Folgen Sie der Benennungskonvention für WPF-Eigenschaften, die Felder von den Eigenschaften unterscheidet, die sie darstellen, indem das Bezeichnerfeld <property name>Property genannt wird. Stellen Sie außerdem statische Get<property name>- und Set<property name>-Zugriffsmethoden bereit, mit denen das Eigenschaftssystem auf Ihre angefügte Eigenschaft zugreifen kann.


    Faszinierend jedensfalls, das zur Laufzeit alles funktioniert aber im Designer nicht. Aber gut, Konvention ist Konvention, das hier hab ich mir gut hinter die Ohren geschrieben.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D