2010-10-31 41 views
2

Je suis en train de déboguer une grande application Silverlight et je trouve sur chaque formulaire que tous les contrôles de boutons reçoivent l'onglet focus deux fois avant de passer au contrôle suivant. Je ne peux pas reproduire ce comportement dans une simple application hello world. Fait intéressant, ce problème ne se produit pas sur les contrôles HyperlinkButton dans le même formulaire, juste Button. Avez-vous une idée de ce que cela pourrait causer, ou de certaines choses qui pourraient m'aider à isoler la cause?Silverlight - La touche de contrôle des boutons arrête deux fois le mystère

Merci d'avance.

[Modifier]

Si je mets la propriété IsTabStop à faux alors il a juste un œil sur le bouton une fois. J'hésite à utiliser cela comme une solution car je voudrais vraiment savoir quelle est la source du problème.

J'ai tracé le problème au style de bouton implicite que nous utilisons dans un fichier de ressources. Je voudrais vraiment savoir pourquoi ce XAML provoque cela.

Bouton Implicite style XAML

<Style TargetType="Button" x:Key="DefaultButtonStyle"> 
    <Setter Property="Background" Value="{StaticResource NormalBrush}"/> 
    <Setter Property="Foreground" Value="{StaticResource TextContentBrush}"/> 
    <Setter Property="FontFamily" Value="{StaticResource ContentFontFamily}"/> 
    <Setter Property="FontSize" Value="{StaticResource ContentFontSize}"/> 
    <Setter Property="Padding" Value="3"/> 
     <Setter Property="Padding" Value="10,3,10,3" /> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="BorderBrush" Value="{StaticResource NormalBorderBrush}"/> 
    <Setter Property="Template"> 
<Setter.Value> 
<ControlTemplate TargetType="Button"> 
<Grid x:Name="grid" RenderTransformOrigin="0.5,0.5"> 
    <Grid.RenderTransform> 
     <TransformGroup> 
      <ScaleTransform/> 
      <SkewTransform/> 
      <RotateTransform/> 
      <TranslateTransform/> 
     </TransformGroup> 
    </Grid.RenderTransform> 
    <VisualStateManager.VisualStateGroups> 
     <VisualStateGroup x:Name="CommonStates"> 
      <VisualStateGroup.Transitions> 
       <VisualTransition From="MouseOver" GeneratedDuration="0:0:0.1" To="Pressed"> 
        <VisualTransition.GeneratedEasingFunction> 
         <ExponentialEase EasingMode="EaseIn" Exponent="-2"/> 
        </VisualTransition.GeneratedEasingFunction> 
       </VisualTransition> 
       <VisualTransition From="Pressed" GeneratedDuration="0:0:0.1" To="MouseOver"> 
        <VisualTransition.GeneratedEasingFunction> 
         <ExponentialEase EasingMode="EaseOut" Exponent="0"/> 
        </VisualTransition.GeneratedEasingFunction> 
       </VisualTransition> 
       <VisualTransition From="Normal" GeneratedDuration="0:0:0.01" To="MouseOver"> 
        <VisualTransition.GeneratedEasingFunction> 
         <ExponentialEase EasingMode="EaseIn" Exponent="7"/> 
        </VisualTransition.GeneratedEasingFunction> 
       </VisualTransition> 
       <VisualTransition From="MouseOver" GeneratedDuration="0:0:0.1" To="Normal"> 
        <VisualTransition.GeneratedEasingFunction> 
         <CircleEase EasingMode="EaseIn"/> 
        </VisualTransition.GeneratedEasingFunction> 
       </VisualTransition> 
      </VisualStateGroup.Transitions> 
      <VisualState x:Name="Normal"/> 
      <VisualState x:Name="MouseOver"> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="MouseOverBorder"> 
         <EasingDoubleKeyFrame KeyTime="0" Value="1"/> 
        </DoubleAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="contentPresenter"> 
         <EasingColorKeyFrame KeyTime="0" Value="{StaticResource BaseColor2}"/> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Pressed"> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="PressedBorder" Storyboard.TargetProperty="(UIElement.Opacity)"> 
         <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="1.0" KeySpline="0,0,0.0299999993294477,0.920000016689301"/> 
        </DoubleAnimationUsingKeyFrames> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleX)" Storyboard.TargetName="grid"> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.01" Value="1.05"/> 
        </DoubleAnimationUsingKeyFrames> 
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[0].(ScaleTransform.ScaleY)" Storyboard.TargetName="grid"> 
         <EasingDoubleKeyFrame KeyTime="0:0:0.01" Value="1.05"/> 
        </DoubleAnimationUsingKeyFrames> 
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Control.Foreground).(SolidColorBrush.Color)" Storyboard.TargetName="contentPresenter"> 
         <EasingColorKeyFrame KeyTime="0" Value="{StaticResource BaseColor2}"/> 
        </ColorAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Disabled"> 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="DisabledVisualElement" Storyboard.TargetProperty="(UIElement.Opacity)"> 
         <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0.75"/> 
        </DoubleAnimationUsingKeyFrames> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="(UIElement.Opacity)"> 
         <SplineDoubleKeyFrame KeyTime="00:00:00.1000000" Value="0.3"/> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
     </VisualStateGroup> 
     <VisualStateGroup x:Name="FocusStates"> 
      <VisualState x:Name="Focused" > 
       <Storyboard> 
        <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="(UIElement.Opacity)"> 
         <SplineDoubleKeyFrame KeyTime="00:00:00" Value="1.0" /> 
        </DoubleAnimationUsingKeyFrames> 
       </Storyboard> 
      </VisualState> 
      <VisualState x:Name="Unfocused"/> 
     </VisualStateGroup> 
    </VisualStateManager.VisualStateGroups> 
    <Border x:Name="BaseBorder" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="1" CornerRadius="1" > 
     <Border.Background> 
      <SolidColorBrush Color="{StaticResource BaseColor7}"/> 
     </Border.Background> 
     <Grid> 
      <Border x:Name="Background" BorderBrush="{StaticResource NormalInnerBorderBrush}" Background="{TemplateBinding Background}"/> 
      <Border x:Name="MouseOverBorder" Opacity="0" Background="{StaticResource MouseOverBrush}" Margin="-0.5,-0.5,0.5,0.5"/> 
      <Border x:Name="PressedBorder" BorderThickness="{TemplateBinding BorderThickness}" Opacity="0" Background="{StaticResource MouseOverBrush}" RenderTransformOrigin="0.5,0.5" Margin="-1"> 
       <Border.RenderTransform> 
        <TransformGroup> 
         <ScaleTransform/> 
         <SkewTransform/> 
         <RotateTransform/> 
         <TranslateTransform/> 
        </TransformGroup> 
       </Border.RenderTransform> 
      </Border> 
     </Grid> 
    </Border> 
    <Rectangle x:Name="DisabledVisualElement" Fill="{StaticResource DisabledBackgroundBrush}" IsHitTestVisible="false" Opacity="0" RadiusY="1" RadiusX="1" Stroke="{StaticResource DisabledBackgroundBrush}"/> 
    <ContentControl x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Foreground="{TemplateBinding Foreground}" Padding="2" /> 
    <Rectangle x:Name="FocusVisualElement" Stroke="{StaticResource FocusedBrush}" Margin="-1" Opacity="0" /> <!--IsHitTestVisible="false"--> 
</Grid> 
</ControlTemplate> 
</Setter.Value> 
</Setter> 
</Style> 
+0

Cela se produit parce que le premier foyer est sur le TextBlock dans le bouton, le second foyer est le bouton, la raison pour laquelle il même se concentre sur le TextBlock est parce que vous avez un modèle remplaçant le style par défaut – Neil

Répondre

6

Essayez de définir la propriété IsTabStop du ContentControl dans votre modèle False:

<ContentControl x:Name="contentPresenter" IsTabStop="False" (...) /> 
+0

Ça a marché, merci. Est-ce un comportement intentionnel de Silverlight? Je voudrais vraiment savoir la raison derrière ceci ou pourquoi il doit être fait en établissant des styles par défaut sur des boutons. – James

+0

Votre style n'est définitivement pas celui par défaut. La logique ici est que tout ce qui dérive de Control (y compris ContentControl) a IsTabStop = true par défaut, car dans la plupart des cas, vous n'utilisez pas d'autres contrôles dans les contrôles. Par conséquent, vous devez le définir explicitement sur false lorsque vous ne souhaitez pas qu'un deuxième onglet s'arrête dans votre modèle. – robertos

+0

J'ai eu le même problème avec ContentControl, cela n'avait rien à voir avec le style. Merci robertos. – RyBolt

1

Il y a probablement quelque chose sur le modèle de votre Button qui a IsTabStop valeur true.

Quelle est la complexité de votre modèle? Essayez de réinitialiser le modèle par défaut pour voir si cela résout votre problème.

+0

Nous utilisons un style de bouton implicite dans un fichier de modèle de ressource. Je vais coller ce code dans mon commentaire. Si je supprime ce style de bouton implicite, cela fonctionne parfaitement, mais les boutons n'ont plus le bon look. Comment puis-je réinitialiser le modèle du bouton? – James