WPF自定义文本框选项卡索引重点

时间:2013-12-21 17:59:05

标签: c# wpf textbox focus tabindex

我有这种文本框。当我使用它并尝试使用Tab按钮文本框循环浏览我的内容时,使用此样式会在按Tab键两次后获得焦点。在第一个Tab中,“聚焦”状态动画可以工作,但插入符不在那里。我再次点击标签并显示插入符号。

<Style x:Key="MPTextBox" TargetType="{x:Type TextBox}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Border x:Name="border" BorderBrush="#FFEF7B54" BorderThickness="2" Background="White" CornerRadius="5">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="Disabled"/>
                                    <VisualState x:Name="ReadOnly"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                                <EasingColorKeyFrame KeyTime="0:0:0.5" Value="#FF57C0AF"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Unfocused"/>
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                                <EasingColorKeyFrame KeyTime="0" Value="#FFED4B15"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <TextBox Background="{x:Null}" BorderBrush="{x:Null}" CaretBrush="#FFF05A29" BorderThickness="0" Margin="5,5,5,0" FontFamily="Public Enemy NF" FontSize="16" Foreground="#FFF05A29" HorizontalAlignment="Stretch" d:LayoutOverrides="Width, Height" VerticalAlignment="Stretch" Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>

我希望只在一个Tab击中发生这一切。

此文本框的另一个问题是,如果我尝试在事件处理程序中访问Text属性,例如KeyDown事件,则它显示为null,并且在文本框失去焦点之前,控件中的文本永远不会设置。

1 个答案:

答案 0 :(得分:0)

此处的问题是文本框存在于控件模板中。

  1. 如果您在控件模板中有TextBox事件,您可以知道文本是由控件模板的文本框捕获的,只有在lostFocus上,它会设置为outerTextBox(应用样式的地方)。如果您想要每个在外部文本中更新要更新的文本,然后在控件中指定代码 UpdateSourceTrigger = PropertyChanged 模板的textBox。 默认情况下,仅在丢失焦点时,控件模板的文本框中的值将在外部TextBox(应用样式)中更新。

  2. 关于双重焦点,这是因为边框,然后是文本框。

  3. 但下面是为textBox定义ControlTemplate的正确方法 所以在setter中定义caretBrush,Border画笔如下

    <Style x:Key="MPTextBox" TargetType="{x:Type TextBox}">
    
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type TextBox}">
                        <Microsoft_Windows_Themes:ClassicBorderDecorator x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" BorderStyle="Sunken" Background="{TemplateBinding Background}">
                            <VisualStateManager.VisualStateGroups>
                                <VisualStateGroup x:Name="CommonStates">
                                    <VisualState x:Name="Normal"/>
                                    <VisualState x:Name="Disabled"/>
                                    <VisualState x:Name="ReadOnly"/>
                                    <VisualState x:Name="MouseOver">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                                <EasingColorKeyFrame KeyTime="0:0:0.5" Value="#FF57C0AF"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                                <VisualStateGroup x:Name="FocusStates">
                                    <VisualState x:Name="Unfocused"/>
                                    <VisualState x:Name="Focused">
                                        <Storyboard>
                                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                                <EasingColorKeyFrame KeyTime="0" Value="#FFED4B15"/>
                                            </ColorAnimationUsingKeyFrames>
                                        </Storyboard>
                                    </VisualState>
                                </VisualStateGroup>
                            </VisualStateManager.VisualStateGroups>
                            <ScrollViewer x:Name="border" FontWeight="Bold">
                                <ScrollViewer.Background>
                                    <!-- Button: common to all buttons -->
                                    <SolidColorBrush Color="{DynamicResource VeryLightGray}"/>
                                </ScrollViewer.Background>
                            </ScrollViewer>                            
                        </Microsoft_Windows_Themes:ClassicBorderDecorator>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Setter Property="Background" Value="{x:Null}"/>
            <Setter Property="CaretBrush" Value="{DynamicResource {x:static SystemColors.WindowTextBrushKey}}"/>
    

    此处xmlns: Microsoft_Windows_Themes =“clr-namespace:Microsoft.Windows.Themes; assembly = PresentationFramework.Classic”