2013-08-17 3 views
2

Я сделал ControlTemplate для кнопок в Resources, как показано ниже:WPF: изменение свойства элементов общего управления шаблоном

<ControlTemplate x:Key="buttonCtrlTemp" TargetType="{x:Type Button}"> 
        <DockPanel x:Name="dock"> 
         <Image x:Name="btnImg" Height="16" Width="16" DockPanel.Dock="Left"/> 
         <TextBlock VerticalAlignment="Center" Text="{TemplateBinding Button.Content}"/> 
        </DockPanel> 
        <ControlTemplate.Triggers> 
         <Trigger Property="Button.IsMouseOver" Value="True"> 
          <Setter TargetName="dock" Property="Background" Value="{StaticResource AppBlue}"/> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 

Я ссылка это с кнопки, как

<Button Content="Login" Template="{StaticResource buttonCtrlTemp}"/>

Однако , Я хочу иметь другое изображение для разных кнопок и, следовательно, потребуется какой-то способ установить источник элемента Image в шаблоне управления с помощью кнопки. Как я могу это сделать?

ответ

1

В этом случае вы можете использовать Tag. Пример:

В Template:

<Image x:Name="btnImg" Source="{TemplateBinding Tag}" Height="16" Width="16" DockPanel.Dock="Left" /> 

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

<!-- In Resources --> 
<BitmapImage x:Key="MyFind" UriSource="/BlackFind.jpg" /> 

<Button Name="FindTestButton" Tag="{StaticResource MyFind}" Template="{StaticResource buttonCtrlTemp}" ... /> 

В шаблоне лучше использовать ContentPresenter вместо TextBlock. Поскольку этот элемент управления отвечает за отображение содержимого управления, что является его единственной целью. Соответственно, во-первых, он меньше, чем «вес» (почти все элементы управления имеют ваш ContentPresenter), а во-вторых, контент может быть универсальным. Полный пример:

<Window.Resources> 
    <BitmapImage x:Key="MyFind" UriSource="/BlackFind.jpg" /> 
    <BitmapImage x:Key="MyAttach" UriSource="/attachment.png" /> 

    <ControlTemplate x:Key="buttonCtrlTemp" TargetType="{x:Type Button}"> 
     <DockPanel x:Name="dock" Background="{TemplateBinding Background}"> 
      <Image x:Name="btnImg" Source="{TemplateBinding Tag}" Height="16" Width="16" DockPanel.Dock="Left" /> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True" /> 
     </DockPanel> 

     <ControlTemplate.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter TargetName="dock" Property="Background" Value="Gray" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
    </ControlTemplate> 
</Window.Resources> 

<Grid> 
    <Button Name="FindTestButton" Width="100" Tag="{StaticResource MyFind}" Background="Gainsboro" Content="FindButton" Height="30" Template="{StaticResource buttonCtrlTemp}" /> 
    <Button Name="AttachTestButton" Width="100" Tag="{StaticResource MyAttach}" Background="Gainsboro" Content="AttachButton" Height="30" Template="{StaticResource buttonCtrlTemp}" Margin="0,80,0,0" /> 
</Grid> 

Output

enter image description here

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