2016-12-12 3 views
0

J'ai créé un contrôle personnalisé pour le bouton. Mon contrôle est le type de IconButton. Mais j'ai défini le style SuccessButton pour le type Button. Je ne change pas TargetType du bouton à IconButton parce que BaseOn est mis en place au bouton de mahapps.Bouton personnalisé avec style pour un autre type de cible

Voici mon code:

Style.xaml:

<Style x:Key="SuccessButton" TargetType="Button" BasedOn="{StaticResource MetroFlatButton}"> 
    <Setter Property="Background" Value="#FF449D44"/> 
    <Setter Property="Foreground" Value="#fff"/> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="#4AAA4A"/> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

IconButton:

<Button Margin="0 0 0 0" VerticalAlignment="Center" ToolTipService.Placement="Bottom"> 
     <StackPanel Orientation="Horizontal"> 
      <Rectangle Width="12" Height="12" Fill="{Binding Path=Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"> 
       <Rectangle.OpacityMask> 
        <VisualBrush Stretch="Fill" Visual="{Binding Path=Icon,RelativeSource={RelativeSource AncestorType={x:Type local:IconButton}}}" /> 
       </Rectangle.OpacityMask> 
      </Rectangle> 
      <TextBlock Text="{Binding Path=Message,RelativeSource={RelativeSource AncestorType={x:Type local:IconButton}}}" FontSize="10" Margin="2 0 0 0"/> 
     </StackPanel> 
    </Button> 

code derrière:

public partial class IconButton 
    { 
     public static readonly DependencyProperty MessageProperty 
      = DependencyProperty.Register("Message", typeof(string), typeof(IconButton)); 

     public static readonly DependencyProperty IconProperty 
      = DependencyProperty.Register("Icon", typeof(Canvas), typeof(IconButton)); 

     public string Message 
     { 
      get { return (string)GetValue(MessageProperty); } 
      set { SetValue(MessageProperty, value);} 
     } 

     public Canvas Icon 
     { 
      get { return (Canvas) GetValue(IconProperty); } 
      set { SetValue(IconProperty, value);} 
     } 

     public IconButton() 
     { 
      InitializeComponent(); 
     } 
    } 

Utilisation:

style a erreur:

'Button TargetType does not match type of element IconButton'

Comment je résolu ce problème? IconButton doit avoir un style pour IconButton mais j'ai un style pour seulement Button.

Merci pour les conseils.

+0

Je suppose que votre 'TargetType' devrait être quelque chose comme' TargetType = "{x: Tapez le bouton}'? –

+0

@AshishSrivastava 'TargetType =" Button "' fonctionne aussi bien. – Clemens

Répondre

1

Si vous voulez être en mesure d'appliquer un style avec un TargetType de bouton à votre commande IconButton la classe IconButton must Hériter de Button:

public partial class IconButton : System.Windows.Controls.Button 
{ 
    public static readonly DependencyProperty MessageProperty 
     = DependencyProperty.Register("Message", typeof(string), typeof(IconButton)); 

    public static readonly DependencyProperty IconProperty 
     = DependencyProperty.Register("Icon", typeof(Canvas), typeof(IconButton)); 

    public string Message 
    { 
     get { return (string)GetValue(MessageProperty); } 
     set { SetValue(MessageProperty, value); } 
    } 

    public Canvas Icon 
    { 
     get { return (Canvas)GetValue(IconProperty); } 
     set { SetValue(IconProperty, value); } 
    } 

    ... 
} 

Si elle n'est pas en fait Button et vous ne peut pas appliquer un style de bouton à un contrôle qui n'est pas réellement un bouton.