Метаданные, игнорируемые? - PullRequest
4 голосов
/ 25 марта 2011

Я сделал очень простой тестовый проект:

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);, он снова станет синим, а затем белым вместо красного.

Я не понимаю.

Ответы [ 2 ]

2 голосов
/ 25 марта 2011

Вы можете установить Background в стиле, применяемом к вашему MyTextBox:

<Application.Resources>
    <Style TargetType="local:MyTextBox">
        <Setter Property="Background" Value="Red" />
    </Style>
</Application.Resources>

Как CodeNaked упомянул, что ваше значение метаданных по умолчанию переопределяется стилем по умолчанию для текстового поля. Вы можете увидеть это, если измените свой код:

MyTextBox.cs:

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

    private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        // set breakpoint here
    }

Когда точка останова будет остановлена, вы увидите, что OldValue было Red, NewValue - White, и из трассировки стека вы можете увидеть, что это происходит из-за применения стиля по умолчанию.

2 голосов
/ 25 марта 2011

Фон устанавливается по умолчанию в стиле TextBox. На основании значения свойства Зависимость Приоритет Красный находится на # 11, а стиль по умолчанию на # 9. Синяя настройка будет на # 3, так что следует переопределить фоновый штраф.

Вы должны либо явно установить фон (как вы делаете с синей кистью), либо создать свой собственный стиль по умолчанию, который не устанавливает фон. Ваш стиль по умолчанию может быть основан на версии TextBox.

...