2016-06-10 3 views
0

Я стараюсь поддерживать единообразный внешний вид элементов в приложении WPF, и в то же время я хочу создать модифицированный TextBox. Однако, когда я это делаю, стили, которые я определяю на уровне приложения для TextBox, не применяются к классу, который я создал, хотя стиль, созданный для моего настраиваемого элемента управления, использует свойство BasedOn.Пользовательский контроль не наследует стили родителей

Есть ли что-то, что мне не хватает, что ведет к поведению иначе, чем я ожидаю?

я воспроизвел этот вопрос в совершенно новом проекте WPF в VS2010 с этой установкой:

C# Код:

public class CustomTextBox : TextBox 
{ 
    static CustomTextBox() { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomTextBox), new FrameworkPropertyMetadata(typeof(CustomTextBox))); 
    } 
} 

XAML в Themes\Generic.xaml:

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/> 

XAML в App.xaml:

<Application.Resources> 
    <Style TargetType="TextBox"> 
     <Setter Property="Background" Value="Red"/> 
    </Style> 
</Application.Resources> 

Однако в конструкторе, и когда я запустить приложение, то CustomTextBox падает назад Weather.co.ua исполнился стиль по умолчанию для текстового поля, вместо того, чтобы иметь красный фон, даже если предположить, что the documentation for the BasedOn property мой производный класс должен иметь этот стиль ...

Существует несколько способов, которыми стили в WPF могут быть расширены или унаследованы. Стили могут быть основаны на других стилях через это свойство. Когда вы используете это свойство, новый стиль наследует значения исходного стиля, которые явно не переопределены в новом стиле.

...

Примечание: Если вы создаете стиль со свойством TargetType и основывают его на другой стиль, который также определяет свойство TargetType, целевой тип производного стиля должен быть таким же, как и быть получена из типа базового стиля.

ответ

0

Короткий ответ: Ваш стиль основан на StaticResource

<Style TargetType="{x:Type local:CustomTextBox}" BasedOn="{StaticResource {x:Type TextBox}}"/> 

Когда вы сделали это, вы не изменяете StaticResource

<Style TargetType="TextBox"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

Так CustomTextBox не должен наследовать красный задний план.

Смежные вопросы