2010-10-31 37 views
2

我正在調試一個大的Silverlight應用程序,並且我在每一個表單上找到所有按鈕控件在進入下一個控件前接收選項卡焦點兩次。儘管如此,我無法在簡單的Hello World應用程序中重現此行爲。有趣的是,這個問題不會發生在同一個窗體中的HyperlinkBut​​ton控件上,只是Button。任何想法會導致這一點,或有些事情可以幫助我隔離這個原因?Silverlight - 按鈕控制製表符停止兩次神祕

在此先感謝。

[編輯]

如果我設置IsTabStop屬性設置爲false那麼它只是標籤上的按鈕一次。我毫不猶豫地將此作爲解決方案,因爲我真的很想知道問題的根源。

我將問題追溯到我們在資源文件中使用的隱式按鈕樣式。我真的很想知道爲什麼這個XAML會導致這種情況發生。

隱按鈕樣式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

這是因爲第一個重點是在按鈕中的TextBlock;第二個重點是按鈕,之所以它甚至熱點在TextBlock上是因爲您有一個模板覆蓋默認樣式 – Neil 2011-03-25 07:50:55

回答

6

嘗試在你的模板設置ContentControlIsTabStop屬性設爲False:

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

工作,謝謝。這是Silverlight的故意行爲嗎?我真的很想知道這背後的理由,或者爲什麼在按鈕上設置默認樣式時必須完成的。 – James 2010-10-31 18:36:42

+0

你的風格絕對不是默認設置。這裏的基本原理是,任何派生自Control(包括ContentControl)的內容都默認爲IsTabStop = true,因爲在大多數情況下,您不會在控件內部使用其他控件。因此,如果您不想在模板中使用第二個製表符,則需要將其明確設置爲false。 – robertos 2010-11-01 02:01:26

+0

我與ContentControl有同樣的問題,它與風格無關。謝謝robertos。 – RyBolt 2011-02-09 16:46:56

1

有可能是在具有IsTabStop設置爲true你Button的模板的東西。

你的模板有多複雜?嘗試重置爲默認模板,看看是否可以解決您的問題。

+0

我們在資源模板文件中使用隱式按鈕樣式。我將在我的評論中粘貼該代碼。如果我刪除了這種隱式按鈕樣式,它完美地工作,但按鈕不再有正確的樣子。我如何去重置按鈕的模板? – James 2010-10-31 17:47:48