4 Stimmen

Metadaten werden überschrieben ignoriert?

Ich habe ein sehr einfaches Testprojekt erstellt:

MainWindow.xaml:

MainWindow.xaml.cs:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace Test
{
   public partial class MainWindow : Window
   {
      public MainWindow()
      {
         InitializeComponent();

            MyTextBox myTextBox = new MyTextBox("some text here");

            mainPanel.Children.Add(myTextBox);
      }
   }
}

MyTextBox.cs:

using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace Test
{
    class MyTextBox : TextBox
    {
        static MyTextBox()
        {
            MyTextBox.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(Brushes.Red));
        }

        public MyTextBox(string Content)
        {
            Text = Content;
        }
    }
}

dies, um die MetaData-Überschreibungsfunktion zu testen.

jetzt das Problem ist: das funktioniert nicht wie erwartet...

tatsächlich ist der Hintergrund von MyTextBox weiß und nicht rot.

Ich habe untersucht und versucht dies als Konstruktor für meine benutzerdefinierte Klasse:

public MyTextBox(string Content)
{
    Text = Content;
    Background = Brushes.Blue;
    ClearValue(BackgroundProperty);
}

hier ist, was ich herausgefunden habe, als ich debugged habe:

in der Hauptklasse:

MyTextBox myTextBox = new MyTextBox("some text here");

wir gehen in den statischen Konstruktor der benutzerdefinierten Klasse, dann in den Konstruktor der Instanz:

Text = Content; >> Hintergrund = Rot

Background = Brushes.Blue; >> Hintergrund = Blau

ClearValue(BackgroundProperty); >> Hintergrund = wieder Rot (wie erwartet)

wir gehen zurück zur Hauptklasse:

mainPanel.Children.Add(myTextBox);

... und direkt nach dieser Zeile Code ist myTextBox.Background Weiß.

Frage: Warum?

warum wird dies weiß gesetzt, wenn ich es dem mainPanel hinzufüge??? Ich kann keine logische Erklärung dafür finden...

außerdem, wenn ich noch mehr Code hinzufüge, wo ich so etwas mache wie: myTextBox.Background = Brushes.Blue; und dann myTextBox.ClearValue(MyTextBox.BackgroundProperty);, wird es Blau und dann wieder Weiß, statt Rot.

Ich verstehe nicht.

2voto

CodeNaked Punkte 39375

Der Hintergrund wird durch den Standardstil des Textfelds festgelegt. Basierend auf der Abhängigkeitsreihenfolge von Eigenschaftswerten steht Rot an #11, während der Standardstil an #9 steht. Die blaue Einstellung wäre an #3, also sollte sie den Hintergrund gut überschreiben.

Sie müssten entweder den Hintergrund explizit festlegen (wie Sie es mit dem blauen Pinsel tun) oder Ihren eigenen benutzerdefinierten Standardstil erstellen, der den Hintergrund nicht festlegt. Ihr Standardstil kann auf der Version des Textfelds basieren.

2voto

Snowbear Punkte 16623

Sie können Hintergrund in einem auf Ihren MyTextBox angewendeten Stil festlegen:

        <Setter Property="Hintergrund" Value="Rot" />

Wie CodeNaked erwähnt hat, wird Ihr Standardmetadatenwert durch den Standardstil für das Textfeld überschrieben. Sie können es sehen, wenn Sie Ihren Code ändern:

MyTextBox.cs:

    Control.BackgroundProperty.OverrideMetadata(typeof(MyTextBox), new FrameworkPropertyMetadata(Brushes.Red, 
            FrameworkPropertyMetadataOptions.Inherits, PropertyChangedCallback));

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        // Setzen Sie hier einen Haltepunkt
    }

Wenn der Haltepunkt erreicht wird, können Sie sehen, dass OldValue Rot war, NewValue ist Weiß und aus dem Stack-Trace können Sie sehen, dass dies aufgrund des angewendeten Default-Stils passiert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X