2012-08-10 1 views
1

Я пытаюсь создать шаблон, который изменит фон Button, а также цвет его TextBlock. Я пробовал использовать следующий XAML в своем шаблоне, но он просто заставляет кнопку исчезать при наведении курсора мыши. Есть ли способ изменить свойства содержимого кнопок на триггеры?Измените содержимое кнопки в XAML на триггере

   <ControlTemplate TargetType="{x:Type Button}"> 
       <Border 
         x:Name="Border" 
         CornerRadius="0" 
         BorderThickness="0" 
         Background="{x:Null}" 
         BorderBrush="#FF404040" /> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="true"> 
          <Setter TargetName="Border" Property="Background" Value="White" /> 
          <Setter Property="ContentTemplate"> 
           <Setter.Value> 
            <DataTemplate DataType="TextBlock"> 
             <TextBlock Foreground="Blue" /> 
            </DataTemplate> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

ответ

2

Стиль:

<Style TargetType="{x:Type Button}" x:Key="MyButton"> 
    <Setter Property="OverridesDefaultStyle" Value="True" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border x:Name="Border" 
         CornerRadius="0" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         TextBlock.Foreground="{TemplateBinding Foreground}" 
         BorderBrush="#FF404040"> 
        <ContentPresenter Margin="2" 
             HorizontalAlignment="Center" 
             VerticalAlignment="Center" 
             RecognizesAccessKey="True" /> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter TargetName="Border" Property="Background" Value="White" /> 
         <Setter TargetName="Border" Property="TextBlock.Foreground" Value="Blue" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Использование:

<Button Width="100" Height="50" Content="Lalala" Style="{StaticResource MyButton}" Background="Brown" Foreground="Green" BorderThickness="2"></Button> 
  1. Вы упускаете ContentPresenter, ответственный за визуализацию Content свойства объекта Button.
  2. Для установки переднего плана вы можете использовать TextBlock.Foreground прилагаемое свойство.
  3. Control Styles and Templates всегда был очень полезным для меня :)
+0

Спасибо! Точно, что мне нужно =) – Parker

+0

Боковой вопрос, если содержимое моей кнопки является StackPanel с TextBlock внутри него, я бы просто использовал StackPanel.TextBlock.Foreground вместо TextBlock.Foreground? – Parker

+1

К сожалению, 'TextBlock.Foreground' не будет работать в более сложных сценариях (только по умолчанию). 'StackPanel.TextBlock.Foreground' тоже не будет работать. Когда у вас более сложный контент, я думаю, что стиль должен быть сделан в самом контексте, а не в шаблоне. – ShadeOfGrey