光标在模板化TextBox中不闪烁

Daw*_*wid 7 c# wpf xaml wpf-style

我的一个视图中有以下TextBox:

<TextBox Name="SearchTerm" Style="{StaticResource SearchTermTextBoxStyle}"
         Text="{Binding TemplatesViewModel.SearchTerm, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
         attachedProperties:Watermark.Watermark="Some watermark text"
         KeyboardNavigation.TabIndex="5" />
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,应用了以下样式:

<Style x:Key="SearchTermTextBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid>
                    <TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
                    <TextBlock Text="{Binding (attachedProperties:Watermark.Watermark), Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" x:Name="DefaultTextPrompt"
                           Foreground="#888888" FontStyle="Italic" HorizontalAlignment="Left"
                           VerticalAlignment="Center" IsHitTestVisible="False" Visibility="Hidden"
                           Margin="5,-1,0,0" />
                </Grid>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Text" Value="" />
                            <Condition Property="IsKeyboardFocusWithin" Value="False" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Visibility" TargetName="DefaultTextPrompt" Value="Visible" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

问题是当我获得焦点在SearchTerm TextBox上时,光标根本不会出现.首先我想到的是简单的结论:可能我只是逻辑焦点,而不是键盘焦点.但事实并非如此.我可以自由地将一些文本输入到TextBox中,但我仍然没有得到光标.当我使用鼠标左键进入此TextBox时,光标出现并按预期闪烁.
那么我的TextBox有什么问题呢?

kur*_*a88 0

问题出在TextBox您放入TextBox's 的控件上ControlTemplate。我想当你关注 (parent) 时TextBox,它不会关注ControlTemplate's TextBox

当您使用左键单击时,它会直接转到ControlTemplate's TextBox,因此您的光标会闪烁。

如果您注意到原始(默认)TextBoxControlTemplate,它用于ScrollViewer托管内容,所以我建议您更改

<TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
Run Code Online (Sandbox Code Playgroud)

<ScrollViewer x:Name="PART_ContentHost" Focusable="False" />
Run Code Online (Sandbox Code Playgroud)

这将自动显示Text来自 的TemplatedParent。并且还让您专注于(父级)TextBox