2010-10-05 9 views
1

Je crée un contrôle de zone de texte personnalisé pour disposer de fonctionnalités de mise en forme et de validation par défaut, y compris une propriété de validation personnalisée qui accepte une action ou une fonction personnalisée.Le style de validation de TextBox WPF disparaît lorsque la souris est terminée

Dans ma situation actuelle, je ne peux pas utiliser le cadre de validation d'attribut que certaines personnes ont posté, car je n'ai pas tout à fait accès pour modifier les objets du modèle de données. Je ne peux pas non plus utiliser ValidationRules car toutes les zones de texte nécessitant ces validations ne seront pas forcément liées. J'ai utilisé le style de zone de texte générique dans le constructeur statique plutôt que de définir le mien, mais j'ai ajouté quelques déclencheurs de données pour définir la bordure et l'info-bulle en fonction de ma propriété de dépendance IsValid personnalisée.

Tout semble fonctionner correctement, mais le problème est que lorsque je souris ou cliquez sur une zone de texte qui a échoué à la validation, le style "invalide" disparaît et il va au style de zone de texte par défaut.

J'ai essayé de créer des déclencheurs de données supplémentaires pour l'événement IsMouseOver, IsFocused et IsMouseCaptured (illustré ci-dessous) en vain.

Ai-je raté quelque chose?

Le constructeur statique (montrant que je suis en utilisant le style TextBox:

static ValidatorTextBox() 
    { 
     //Commenting this line out to use the default textbox style 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ValidatorTextBox), new FrameworkPropertyMetadata(typeof(TextBox))); 
    } 

Et voici mon style:

<Style TargetType="{x:Type local:ValidatorTextBox}"> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsValid}" Value="False"> 
      <Setter Property="BorderBrush" Value="Red" /> 
      <Setter Property="BorderThickness" Value="1" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsRequired}" Value="True"> 
      <Setter Property="Background" Value="AliceBlue" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsFocused}" Value="True"> 
      <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=BorderBrush}" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseOver}" Value="True"> 
      <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=BorderBrush}" /> 
     </DataTrigger> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsMouseCaptured}" Value="True"> 
      <Setter Property="BorderBrush" Value="{Binding RelativeSource={RelativeSource Self}, Path=BorderBrush}" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Répondre

2

Le problème est très probablement causé par le modèle de texte par défaut. Aero (et je pense également dans d'autres thèmes) la bordure est en fait un contrôle de chrome qui est changé en une couleur spécifique au passage de la souris. le style de contrôle T Le correctif le plus direct serait de copier réellement le ControlTemplate par défaut dans le Style par défaut de votre contrôle personnalisé et d'utiliser une simple Bordure avec des déclencheurs personnalisés au lieu de simplement dans le Style contenant.

<Style TargetType="{x:Type local:ValidatorTextBox}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:ValidatorTextBox}"> 
       <Border x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="true" > 
        <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
       </Border> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsValid" Value="False"> 
         <Setter Property="Background" TargetName="Bd" Value="Red"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

Super, c'était exactement ce dont j'avais besoin, merci beaucoup. – Travis