2016-03-23 10 views
1

В соответствии с приоритетом свойства значения приоритета локальное значение имеет более высокий приоритет по сравнению с шаблонами управления (см. Ссылку https://msdn.microsoft.com/fr-fr/library/ms743230%28v=vs.85%29.aspx).Локальное значение свойства Background и Content при управлении кнопками не задано, если в шаблоне управления указан фон и содержимое

Но в моем примере ниже, содержание и фона свойство кнопки управления устанавливается из шаблона управления, несмотря на указания эти свойства элемента управления locally.Background установлен Оранжевый и содержание как «TemplateContent»

Ниже XAML:

<Window.Resources> 
     <ControlTemplate x:Key="ButtonTemplate" TargetType="Button" >    
      <Border CornerRadius="10" Width="100" Height="50" Background="Orange"> 
       <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Content="TemplateContent" /> 
      </Border> 
     </ControlTemplate> 
    </Window.Resources> 

<Button Template="{StaticResource ButtonTemplate}" Background="Blue" Grid.Row="2" Grid.Column="0" Content="LocalContent" Width="100" Height="100" HorizontalAlignment="Center"> 

Я также понимаю, локальные значения могут иметь влияние, когда TemplateBinding используется в контрольных template.But почему не локальное значение имеют влияние, несмотря на имеющие более высокий приоритет порядка в зависимости стоимости имущества старшинства

+2

Вам нужно будет использовать привязки шаблонов, если вы хотите, чтобы шаблоны настраивались. Попробуйте заменить «Оранжевый» на '{TemplateBinding Background}'. Если по умолчанию он должен быть оранжевым, укажите стиль, который делает это - этот стиль также может устанавливать шаблон, поэтому вам не нужно делать это явно. –

ответ

1

К сожалению, документация MSDN не очень понятна в этом вопросе (как это часто бывает), и вы неправильно поняли, что они подразумевают под «локальным значением».

В вашем примере «локальное значение» представляет собой Border объект Background присвоение недвижимости в XAML. И это действительно имеет приоритет. Даже если, например, a Style setter попытался установить значение этого свойства, он потерпит неудачу, потому что вы локально задали значение свойства "Orange".

Background="Blue" для элемента Button устанавливает значение совершенно иное свойство. То есть свойство объекта Button, а не объекта Border. Это задание будет фактически также имеют высокий приоритет, но только над вещами, которые могут установить это конкретное свойство (например, стиль Button). Он не влияет на совершенно другой объект, содержащийся в шаблоне (т. Е. Border).

Для этой цели существует разметка {TemplateBinding ...}. Если вы объявите свой шаблон, как это:

<ControlTemplate x:Key="ButtonTemplate" TargetType="Button"> 
    <Border CornerRadius="10" Width="100" Height="50" 
      Background="{TemplateBinding Background}"> 
    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" 
         Content="TemplateContent"/> 
    </Border> 
</ControlTemplate> 

Тогда WPF будет знать, чтобы посмотреть на TemplatedParent объекта и его Background собственности, в частности, найти значение, которое будет установлено значение Border.Background свойства.

+0

Учитывая, как работает приоритет, стоит отметить, что по умолчанию (оранжевый) должен быть задан стиль 'Button', который имеет соответствующий' Setter'. –

+1

@H: Я согласен с вашим предложением об использовании, но я не уверен, полезно ли это для ответа. Я думаю, что синий и оранжевый цвета в исходном вопросе, вероятно, должны были ясно показать, что синий не повлиял на границу. Я не уверен, что на самом деле намерение было обеспечить цвет фона по умолчанию оранжевого цвета (я также не уверен, что он не был). В основном, хотя я всегда беспокоюсь о том, чтобы добавлять слишком много деталей к ответам, рискуя запутыванием первичной точки. Если у вас есть идея, как ввести эту добавленную информацию ясным, путаным способом, я бы приветствовал ваше редактирование. –