Style Setter löst ArgumentNullException aus

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Amro.

    Style Setter löst ArgumentNullException aus

    Guten Morgen,
    ich Portiere gerade eine WinForms Anwendung nach WPF (mein erstes WPF Projekt).
    Dafür benötige ich ein NumericUpDown welches ich mir als Benutzerdefeniertes WPF Steuerelement erstellt habe.

    Eine der Eigenschaften (Step-Eigenschaft) meines NumericUpDown Steuerelemnts löst leider eine ArgumentNullException aus wenn diese in einem Style Attribute gesetzt wird.
    Exception

    Quellcode

    1. System.Windows.Markup.XamlParseException: "Zeilennummer "12" und Zeilenposition "14" von "Beim Festlegen der Eigenschaft "System.Windows.Setter.Property" wurde eine Ausnahme ausgelöst."."
    2. Der Wert darf nicht NULL sein.
    3. Parametername: property
    4. at System.Windows.Setter.CheckValidProperty(DependencyProperty property)
    5. at System.Windows.Baml2006.WpfSharedBamlSchemaContext.<>c.<Create_BamlProperty_Setter_Property>b__343_0(Object target, Object value)
    6. at System.Windows.Baml2006.WpfKnownMemberInvoker.SetValue(Object instance, Object value)
    7. at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(XamlMember member, Object obj, Object value)
    8. at MS.Internal.Xaml.Runtime.ClrObjectRuntime.SetValue(Object inst, XamlMember property, Object value)


    Step-Eigenschaft

    C#-Quellcode

    1. public decimal Step
    2. {
    3. get => (decimal)GetValue(StepProperty);
    4. set
    5. {
    6. if (value < 0)
    7. value = 0.1M;
    8. SetValue(StepProperty, value);
    9. }
    10. }
    11. public static readonly DependencyProperty StepProperty;
    12. static NumericUpDown()
    13. {
    14. DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown)));
    15. // ...
    16. StepProperty = DependencyProperty.Register(nameof(StepProperty), typeof(decimal), typeof(NumericUpDown), new PropertyMetadata(default(decimal)));
    17. }



    Style-Attribute

    XML-Quellcode

    1. <Style TargetType="{x:Type cc:NumericUpDown}">
    2. <Setter Property="Step" Value="1"/>
    3. <Setter Property="MaxValue" Value="2"/>
    4. <Setter Property="MinValue" Value="-1"/>
    5. <Setter Property="Height" Value="20"/>
    6. <Setter Property="Width" Value="100"/>
    7. </Style>



    Kommentiere ich <Setter Property="Step" Value="1"/> funktioniert es ebenso wenn ich die Eigenschaft am Steuerelement selbst festlege.
    Hat jemand eine Idee woran das liegen könnte?
    Eigentlich musst du wenn Benutzerdefeniertes WPF Steuerelement erstellst von Control erben.
    Ich vermute du erbst von NumericDown und kommst da in Konflikt mit Step.
    Wenn nicht dann must du das Template vielleicht neu erstellen.


    Schau ob ein CustomControl ausreicht für das was du vorhast.

    C#-Quellcode

    1. StepProperty = DependencyProperty.Register(nameof(StepProperty), typeof(decimal), typeof(NumericUpDown), new PropertyMetadata(default(decimal)));

    StepProperty? oder "Step"

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

    Amro schrieb:

    von Control erben

    Das tue ich auch.
    DefaultStyleKeyProperty hat VS so erstellt da hab ich nichts dran geändert.

    @DTF
    Versucht hab ich es, geändert hat das leider nichts. Hätte mich aber auch geweundert denn ich setze ja neben Step noch 3 weitere Eigenschaften die keine Ausnahme verursachen.

    Ich hab das Projekt mal angehängt. Besteht aus einer Windows-Anwendung in der das Control eingebunden ist und einer Klassenbibliothek die das Control beinhaltet.
    Dateien
    Das Funktioniert bei mir ohne Probleme.

    C#
    Spoiler anzeigen

    C#-Quellcode

    1. public class NumericUpDown : Control
    2. {
    3. static NumericUpDown()
    4. {
    5. DefaultStyleKeyProperty.OverrideMetadata(typeof(NumericUpDown), new FrameworkPropertyMetadata(typeof(NumericUpDown)));
    6. }
    7. public decimal Step
    8. {
    9. get { return (decimal)GetValue(StepProperty); }
    10. //set { SetValue(StepProperty, value); }
    11. set
    12. {
    13. if (value < 0)
    14. value = 0.1M;
    15. SetValue(StepProperty, value);
    16. }
    17. }
    18. public static readonly DependencyProperty StepProperty =
    19. DependencyProperty.Register("Step", typeof(decimal), typeof(NumericUpDown), new PropertyMetadata(default(decimal)));
    20. }


    XAML
    Spoiler anzeigen

    XML-Quellcode

    1. <Style TargetType="{x:Type local:NumericUpDown}">
    2. <Setter Property="Step" Value="1"/>
    3. <Setter Property="Height" Value="20"/>
    4. <Setter Property="Width" Value="100"/>
    5. <!--<Setter Property="Template">
    6. <Setter.Value>
    7. <ControlTemplate TargetType="{x:Type local:NumericUpDown}">
    8. <ContentPresenter />
    9. </ControlTemplate>
    10. </Setter.Value>-->
    11. <!--</Setter>-->
    12. </Style>


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