Откуда берется свойство зависимостей при переопределении шаблона элемента управления? - PullRequest
2 голосов
/ 04 мая 2011

Допустим, у вас есть 2 кнопки WPF.Одна использует TextBlock, а другая - нет.

<Button x:Name="Button1">
    <TextBlock>inside textblock</TextBlock>
</Button>

и

<Button x:Name="Button2">
   no textblock
</Button>

Обе кнопки используют этот шаблон, который устанавливает свойство зависимости «Передний план» на белый:

<ControlTemplate x:Key="ButtonTemplate" TargetType="{x:Type Button}">            
   <Border Name="Border" TextElement.Foreground="White">
   <ContentPresenter/>
</ControlTemplate>

Кнопка с TextBlock имеет черный текст.Другой работает нормально.Зачем?

Ответы [ 3 ]

2 голосов
/ 04 мая 2011

Это вопрос наследования стоимости, как указывает HB.Наследование значений свойств обычно следует логическому дереву.

В первом случае:

<Button x:Name="Button1">
    <TextBlock>inside textblock</TextBlock>
</Button>

Логическим родителем TextBlock является Button, поэтому он наследует свое значение от Button и так далее дологическое деревоТаким образом, в следующем коде TextBlock будет красным:

<Button x:Name="Button1" TextBlock.Foreground="Red">
    <TextBlock>inside textblock</TextBlock>
</Button>

Во втором случае:

<Button x:Name="Button2">
   no textblock
</Button>

В конечном итоге TextBlock создается ContentPresenter (см. Метод ContentPresenter.ChooseTemplate.в ILSpy / Reflector).В этом случае логическим родителем TextBlock является ContentPresenter.Таким образом, он унаследует свое значение от ContentPresenter и т. Д. Вверх по логическому дереву до Границы, для которой определен белый передний план.

Это кратко задокументировано здесь .

1 голос
/ 04 мая 2011

Не удается найти соответствующую ссылку для этого, если у вас есть TextBlock, который поставляется со своими собственными стилями и настройками, которые могут переопределять вложенное свойство, заданное вами снаружи.

Редактировать: Возможно, проблема наследования значений и приоритета в целом.

0 голосов
/ 04 мая 2011

Если у вас есть неявный стиль TextBlock с цветом, то он не выберет цвет переднего плана, если вы явно не сделаете привязку шаблона.

...