2010-08-04 5 views
1

Je veux que la hauteur de contrôle soit double lorsque la souris est au-dessus de ce contrôle et que la hauteur de contrôle devienne normale lorsque la souris quitte le contrôle. Considérons, j'utilise le style suivant pour faire la hauteur du bouton comme double lorsque la souris est sur un bouton.Comment identifier si le contrôle va dans les limites de contrôle de fenêtre/tabulation dans WPF

<Style TargetType="{x:Type Buttons}"> 
<Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="RenderTransform"> 
      <Setter.Value> 
       <ScaleTransform ScaleX="1" ScaleY="2" /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="RenderTransformOrigin" Value="0.5,0.5"/> 
     <Setter Property="Panel.ZIndex" Value="99999"/> 
    </Trigger> 
</Style.Triggers> 

Si le bouton est placé près de la limite de commande alors la fenêtre/onglet bouton va à l'intérieur des limites de contrôle Tab/fenêtre lors de son expansion. (lorsque la souris est au-dessus du bouton)

Je ne veux pas que le bouton passe à l'intérieur des limites Tab Control/Window. Au lieu de cela, le bouton doit se déplacer à l'intérieur de la fenêtre (RenderTransformOrigin doit être changé) lorsque le bouton touche les limites Tab Control/Window.

J'ai joint mon exemple d'application pour votre référence here.

Répondre

1

Vous pouvez essayer d'utiliser un convertisseur sur votre setter RenderTransformOrigin

Le convertisseur accepte une commande comme paramètre et vérifiez si la position de contrôle dans son parent est compris entre 0 et (ControlHeight/2) et si elle est ensuite calculer et renvoyer une valeur RenderTransformOrigin différente. Sinon, il suffit de retourner la valeur par défaut (0.5,0.5)

Edit: Pour répondre à votre commentaire, je ne suis pas sûr de la syntaxe exacte puisque je ne suis pas tester, mais je pensais à quelque chose de similaire ce qui suit:

Créez votre convertisseur. Il devra probablement être un convertisseur MultiBinding

public class RenderTransformConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     // Get parameters - You'll probably want to include validation and default values 
     UIElement control = (UIElement)value[0];    
     UIElement parent = (UIElement)value[1]; 

     int controlHeight = control.Height; 
     int controlXPositionInParent = control.TranslatePoint(new Point(0, 0), parent).X; 

     if (controlXPositionInParent < (controlHeight * .5)) 
     { 
      // Calculate a new render transform. 
      // Should verify I'm doing the math right, didn't get much sleep last night 
      return new Point(0.5, controlXPositionInParent/controlHeight); 
     } 
     else 
     { 
      return new Point(0.5, 0.5); 
     } 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Votre XAML comprendrait une ligne d'inclure l'espace de noms de conversion, et créer un objet du nouveau convertisseur.

<localNamespace:RenderTransformConverter x:Key="renderTransformConverter /> 

Ensuite, votre style utiliserait par quelque chose comme ceci:

<Setter Property="RenderTransformOrigin"> 
<Setter.Value> 
    <MultiBinding Converter="{StaticResource renderTransformConverter}"> 
     <Binding Path="{Binding RelativeSource=Self}" /> 
     <Binding Path="{Binding RelativeSource=Self, Path=Parent}" /> 
    </MultiBinding> 
</Setter.Value> 

Je ne suis pas positif si vous pouvez passer des commandes en tant que paramètres à un convertisseur, mais sinon vous » Il faudra probablement réarranger les paramètres pour obtenir les valeurs nécessaires au calcul.

+0

salut merci pour vos commentaires, pouvez-vous me donner un exemple? – ksvimal

+0

Édité mon post pour inclure un exemple approximatif – Rachel

+0

Salut Rachel, merci pour vos conseils. Oui, vous avez raison, je ne suis pas en mesure de passer les contrôles en tant que paramètres. J'obtiens l'erreur sur les lignes suivantes et aussi je pense que Parent ne vous donnera que le panneau qui détient ce contrôle mais pas le contrôle onglet/fenêtre. S'il vous plaît corrigez-moi si je me trompe et aussi s'il vous plaît guide moi comment passer les paramètres aux convertisseurs car je n'ai pas beaucoup travaillé sur la partie convertisseur. – ksvimal

Questions connexes