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.
Der Designer zeigt dann "Ungültiges Markup", aber das Projekt kann kompiliert werden und die Anwendung funktioniert.
Mit Fehler
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
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.
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
- Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
- 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.
VB.NET-Quellcode
- Public Class SliderMouseWheel
- Inherits DependencyObject
- Public Shared ReadOnly MouseWheelChange As DependencyProperty = DependencyProperty.RegisterAttached("MouseWheelChangeProperty", GetType(Double), GetType(SliderMouseWheel), New PropertyMetadata(New PropertyChangedCallback(AddressOf MouseWheelChangeChanged)))
- Private Shared Sub MouseWheelChangeChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
- Dim slider As Slider = DirectCast(d, Slider)
- AddHandler slider.MouseWheel, AddressOf OnMouseWheel
- End Sub
- Private Shared Sub OnMouseWheel(sender As Object, e As MouseWheelEventArgs)
- Dim slider As Slider = DirectCast(sender, Slider)
- Dim sliderValue = slider.Value
- Dim change As Double = DirectCast(slider.GetValue(MouseWheelChange), Double)
- If e.Delta > 0 Then
- sliderValue += change
- ElseIf e.Delta < 0 Then
- sliderValue -= change
- End If
- slider.Value = Clamp(sliderValue, slider.Minimum, slider.Maximum)
- End Sub
- Private Shared Function Clamp(value As Double, min As Double, max As Double) As Double
- If value < min Then value = min
- If value > max Then value = max
- Return value
- End Function
- Public Shared Sub SetMouseWheelChangeProperty(uiElement As UIElement, value As Double)
- uiElement.SetValue(MouseWheelChange, value)
- End Sub
- Public Shared Function GetMouseWheelChangeProperty(uiElement As UIElement) As Double
- Return DirectCast(uiElement.GetValue(MouseWheelChange), Double)
- End Function
- End Class
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:WpfApp1"
- mc:Ignorable="d"
- Title="MainWindow" Height="450" Width="800">
- <Window.Resources>
- <Style TargetType="{x:Type Slider}">
- <Setter Property="local:SliderMouseWheel.MouseWheelChangeProperty" Value="1"/>
- </Style>
- </Window.Resources>
- <Grid>
- <Slider Minimum="0" Maximum="100" />
- </Grid>
- </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.
VB.NET-Quellcode
- Public Class SliderMouseWheel
- Public Shared ReadOnly MouseWheelChangeProperty As DependencyProperty = DependencyProperty.RegisterAttached("MouseWheelChange", GetType(Double), GetType(SliderMouseWheel), New PropertyMetadata(AddressOf MouseWheelChangeChanged))
- Private Shared Sub MouseWheelChangeChanged(ByVal d As DependencyObject, ByVal e As DependencyPropertyChangedEventArgs)
- Dim slider As Slider = DirectCast(d, Slider)
- AddHandler slider.MouseWheel, AddressOf OnMouseWheel
- End Sub
- Private Shared Sub OnMouseWheel(sender As Object, e As MouseWheelEventArgs)
- Dim slider As Slider = DirectCast(sender, Slider)
- Dim sliderValue = slider.Value
- Dim change As Double = DirectCast(slider.GetValue(MouseWheelChangeProperty), Double)
- If e.Delta > 0 Then
- sliderValue += change
- ElseIf e.Delta < 0 Then
- sliderValue -= change
- End If
- slider.Value = Clamp(sliderValue, slider.Minimum, slider.Maximum)
- End Sub
- Private Shared Function Clamp(value As Double, min As Double, max As Double) As Double
- If value < min Then value = min
- If value > max Then value = max
- Return value
- End Function
- Public Shared Sub SetMouseWheelChange(uiElement As uiElement, value As Double)
- uiElement.SetValue(MouseWheelChangeProperty, value)
- End Sub
- Public Shared Function GetMouseWheelChange(uiElement As UIElement) As Double
- Return DirectCast(uiElement.GetValue(MouseWheelChangeProperty), Double)
- End Function
- End Class
XML-Quellcode
- <Window x:Class="MainWindow"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- xmlns:local="clr-namespace:WpfApp1"
- mc:Ignorable="d"
- Title="MainWindow" Height="450" Width="800">
- <Window.Resources>
- <Style TargetType="{x:Type Slider}">
- <Setter Property="local:SliderMouseWheel.MouseWheelChange" Value="1"/>
- </Style>
- </Window.Resources>
- <Grid>
- <Slider Minimum="0" Maximum="100" />
- </Grid>
- </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
Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „DTF“ ()