Silverlight - 按钮控件制表符停止两次之谜

标签 silverlight tabs keyboard-events

我正在调试一个大型 Silverlight 应用程序,我发现在每个表单上,所有按钮控件在转到下一个控件之前都会获得两次选项卡焦点。不过,我无法在简单的 hello world 应用程序中重现此行为。有趣的是,这个问题不会发生在同一窗体的 HyperlinkBut​​ton 控件上,只是 Button。知道是什么原因导致的,或者有什么可以帮助我找出原因的吗?

提前致谢。

[编辑]

如果我将 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>

最佳答案

尝试将模板中 ContentControlIsTabStop 属性设置为 False:

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

关于Silverlight - 按钮控件制表符停止两次之谜,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4061821/

相关文章:

R shiny 根据先前的选项卡条件在导航栏中设置选项卡

keyboard-shortcuts - 每当按住某个修饰键时,将箭头键重新映射到 JKLI

linux - 键盘输入解析算法的引用资料?

silverlight - SL4/WCF 不适用于 HTTPS

silverlight - Windows Phone 7的开发平台是什么

android - 使用 FragmentTabHost 在选项卡中显示 Google map

forms - 使用选项卡以表格形式编辑 Symfony2 大实体

vue.js - 如何在vuejs中检测ctrl + z和ctrl + y?

c# - wp7 触觉反馈

wpf - 为什么 ItemsControl 不使用我的 ItemTemplate?