Каретка не отображается в текстовом поле


Я использую следующий стиль для моего текстового поля в WPF:

<Style x:Key="myTxtBoUserInputMedStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Height" Value="35"/>
    <Setter Property="Background" Value="Gainsboro"/>
    <Setter Property="BorderBrush" Value="LightGray"/>
    <Setter Property="BorderThickness" Value="0.5"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
    <Setter Property="VerticalContentAlignment" Value="Center"/>
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="Padding" Value="2,2,2,2"/>
    <Setter Property="Foreground" Value="Black" />
    <Setter Property="FontWeight" Value="Normal"/>
    <Setter Property="Height" Value="25"/>
    <Setter Property="SnapsToDevicePixels" Value="True"/>
    <Setter Property="BorderBrush" Value="Black"/>
    <Setter Property="Background" Value="LightGray"/>
    <Setter Property="Foreground" Value="Black"/>
    <Setter Property="CaretBrush" Value="Black"/>
    <EventSetter Event="KeyDown" Handler="TextBoxKeyDownHandler"/>
    <EventSetter Event="GotFocus" Handler="TextBoxGotFocusHandler"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Border BorderBrush="{TemplateBinding BorderBrush}" 
                        BorderThickness="{TemplateBinding BorderThickness}" 
                        Background="{TemplateBinding Background}"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        TextElement.Foreground="Black"
                        CornerRadius="2">
                   <ContentPresenter
                        Content="{TemplateBinding Text}"
                        Width="145"
                        VerticalAlignment="Center"
                        HorizontalAlignment="Center"
                        Height="24" Margin="5,0,0,0">
                    </ContentPresenter>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter Property="Background" Value="LightBlue"/>
                        <Setter Property="Foreground" Value="Black"/>
                        <Setter Property="FontWeight" Value="Bold"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

GotFocusEvent реализуется следующим образом:

private void TextBoxGotFocusHandler(object sender, RoutedEventArgs e)
{
    TextBox tb = (TextBox)sender;
    if (tb.SelectedText.Length == 0)
    {
        tb.CaretIndex = tb.Text.Length;
    }
}
Но моя проблема в том, что каретка никогда не отображается в моем текстовом поле. Если я использую текстовое поле без моего стиля, я могу видеть заботу. Так что это должно быть связано с моим стилем. Как я должен изменить свой стиль, чтобы показать каре?

Заранее спасибо!

1 3

1 ответ:

Измените ContentPresenter в шаблоне на ScrollViewer и дайте ему имя PART_ContentHost

Изменение

<ContentPresenter Content="{TemplateBinding Text}"
                  Width="145"
                  VerticalAlignment="Center"
                  HorizontalAlignment="Center"
                  Height="24"
                  Margin="5,0,0,0">
</ContentPresenter>

To

<ScrollViewer x:Name="PART_ContentHost"
              Width="145"
              VerticalAlignment="Center"
              HorizontalAlignment="Center"
              Height="24"
              Margin="5,0,0,0" />

Рендеринг текста и курсора в текстовом поле выполняется через PART_ContentHost

От MSDN

PART_ContentHost : визуальный элемент, который может содержать элемент FrameworkElement. Текст текстового поля отображается в этом элементе.