我有这种文本框。当我使用它并尝试使用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,并且在文本框失去焦点之前,控件中的文本永远不会设置。
答案 0 :(得分:0)
此处的问题是文本框存在于控件模板中。
如果您在控件模板中有TextBox事件,您可以知道文本是由控件模板的文本框捕获的,只有在lostFocus上,它会设置为outerTextBox(应用样式的地方)。如果您想要每个在外部文本中更新要更新的文本,然后在控件中指定代码 UpdateSourceTrigger = PropertyChanged 模板的textBox。 默认情况下,仅在丢失焦点时,控件模板的文本框中的值将在外部TextBox(应用样式)中更新。
关于双重焦点,这是因为边框,然后是文本框。
但下面是为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”