Каретка не отображается в текстовом поле
Я использую следующий стиль для моего текстового поля в 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 ответ:
Измените
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. Текст текстового поля отображается в этом элементе.