none
Default-Foreground in Metadata wird nicht benutzt RRS feed

  • Frage

  • Hallo,

    woran kann es liegen, dass das Überschreiben von DependencyProperty-Default-Werten beim einen Property wirkt, beim anderen nicht? Z.B. in einer Ableitung von TextBox wird die neue Default-FontSize eingestellt, der neue Default-Foreground nicht.

    public class TextBoxAbgeleitet : TextBox
    {
    	static TextBoxAbgeleitet()
    	{
    		try
    		{
    			// Default-FontSize funktioniert...
    			FontSizeProperty.OverrideMetadata(typeof(TextBoxAbgeleitet), new FrameworkPropertyMetadata(20d));
    
    			// Default-Foreground nicht.
    			ForegroundProperty.OverrideMetadata(typeof(TextBoxAbgeleitet), new FrameworkPropertyMetadata(Brushes.Red));
    		//	ForegroundProperty.OverrideMetadata(typeof(TextBoxAbgeleitet), new FrameworkPropertyMetadata(Brushes.Red, FrameworkPropertyMetadataOptions.OverridesInheritanceBehavior,
    		//																								null, OnCoerceForeground));
    		}
    		catch (Exception ex)
    		{
    			throw ex;
    		}
    	}
    	private static object OnCoerceForeground(DependencyObject d, object baseValue)
    	{
    		// Nur hiermit würde der Foreground rot dargestellt, aber das ist ja nicht Sinn der Sache, nur rot zuzulassen.
    	//	return Brushes.Red;
    	}
    }
    <local:TextBoxAbgeleitet Width="200" Text="hallo" />

    Was gibt es da zu beachten?

    Gruß
    Heiko

    Dienstag, 6. Oktober 2015 09:26

Alle Antworten

  • Hallo Heiko65456465,

    Ich habe in diesem Thread ein Verfahren, das von einem PropertyChangedCallback und von Reflexion Gebrauch macht, gefunden. Hoffentlich hilft es (oder das zweite Verfahren mit der Inherits-Eigenschaft) auch Dir weiter.

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Mittwoch, 7. Oktober 2015 09:23
    Moderator
  • Hallo Dimitar,

    vielen Dank für deine Recherche. Leider funktionieren beide Varianten bei mir nicht. Die Variante, bei der man Inherits auf false setzt, bewirkt keine Änderung.

    Die andere Variante mit Invoke() liefert mir immer "Unknown" statt "Inherit" zurück. Damit bleibt der Default-Foreground immer der alte. Wenn ich bei "Unknown" auch Red setze, kann im XAML keine andere Farbe mehr eingestellt werden.

    Es scheint auch davon abzuhängen, von welcher Klasse man abgeleitet hat. Ich habe eine Ableitung von UserControl und eine von TextBox. (Im Beispiel hinter dem Link wurde von TextBlock abgeleitet.)

    Die Änderung des Default-Foreground bewirkt in beiden Ableitungen nichts. Die Änderung der Default-FontSize wirkt sich nur in der Ableitung von UserControl aus.  Es gibt also einen Unterschied zwischen beiden Properties obwohl sie für beide Klassen (UserControl und TextBox) jeweils aus der Basis-Klasse Control verwendet werden.

    In der MSDN-Doku bin ich auch nicht fündig geworden. Ich nehme das jetzt mal als gegeben hin. Man muß eben ausprobieren, ob sich der Default-Wert eines Propertys überschreiben läßt. Mein Schluss daraus ist, dass man nicht von einer Basisklasse ableiten kann, wenn man eine Überschreibung eines DependencyPropertys braucht, die aber keine Wirkung zeigt.

    Gruß
    Heiko

    Mittwoch, 7. Oktober 2015 14:38