Я сделал очень простой тестовый проект:
MainWindow.xaml:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Test"
Title="MainWindow" Height="350" Width="525" VerticalAlignment="Center" HorizontalAlignment="Center">
<StackPanel x:Name="mainPanel" />
</Window>
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;
}
}
}
это, чтобы проверить функцию переопределения метаданных.
Теперь проблема в том, что это не работает, как я ожидал ...
действительно, фон MyTextBox белый, а не красный.
Я исследовал и попробовал это как конструктор для моего пользовательского класса:
public MyTextBox(string Content)
{
Text = Content;
Background = Brushes.Blue;
ClearValue(BackgroundProperty);
}
Теперь вот что я узнал при отладке:
в основном классе:
MyTextBox myTextBox = new MyTextBox("some text here");
заходим в статический конструктор пользовательского класса, затем в конструктор экземпляра:
Text = Content;
>> Фон = красный
Background = Brushes.Blue;
>> Фон = синий
ClearValue(BackgroundProperty);
>> Фон = снова красный (как и ожидалось)
Возвращаемся к основному классу:
mainPanel.Children.Add(myTextBox);
... и сразу после этой строки кода, myTextBox.Background
- Белый.
Вопрос: почему?
почему это установлено в белый цвет, когда я добавляю его в главную панель ??? Я не могу найти никакого логического объяснения этому ...
Более того, если я добавлю еще код, где я сделаю что-то вроде: myTextBox.Background = Brushes.Blue;
, а затем myTextBox.ClearValue(MyTextBox.BackgroundProperty);
, он снова станет синим, а затем белым вместо красного.
Я не понимаю.