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.