Почему мой TextBox с пользовательским шаблоном управления не имеет видимого текстового курсора? - PullRequest
2 голосов
/ 07 июня 2010

У меня есть пользовательский шаблон элемента управления, который устанавливается через свойство style в TextBox. Визуальные атрибуты установлены правильно, даже ввод текста в текстовое поле работает, но курсор вставки (символ |) не виден, что затрудняет редактирование для наших пользователей.

Как шаблон элемента управления нужно изменить, чтобы вернуть традиционное поведение TextBox?

<Style x:Key="DemandEditStyle" TargetType="TextBox">
    <EventSetter Event="LostFocus" Handler="DemandLostFocus" />
    <Setter Property="HorizontalAlignment" Value="Stretch" />
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="1" />
                    </Grid.ColumnDefinitions>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="*" />
                        <RowDefinition Height="1" />
                    </Grid.RowDefinitions>
                    <Grid.Background>
                        <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
                            <GradientStop Color="White" Offset="0" />
                            <GradientStop Color="White" Offset="0.15" />
                            <GradientStop Color="#EEE" Offset="1" />
                        </LinearGradientBrush>
                    </Grid.Background>
                    <Border Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="2" Background="Black" />
                    <Border Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Background="Black" />
                    <Grid Grid.Row="0" Grid.Column="0" Margin="2">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1" />
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="1" />
                        </Grid.ColumnDefinitions>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="1" />
                            <RowDefinition Height="*" />
                            <RowDefinition Height="1" />
                        </Grid.RowDefinitions>
                        <Border Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="3" Background="Black" />
                        <Border Grid.Row="0" Grid.Column="0" Grid.RowSpan="3" Background="Black" />
                        <Border Grid.Row="2" Grid.Column="0" Grid.ColumnSpan="3" Background="#CCC" />
                        <Border Grid.Row="0" Grid.Column="2" Grid.RowSpan="3" Background="#CCC" />
                        <TextBlock Grid.Row="1" Grid.Column="1"
                               TextAlignment="Right" HorizontalAlignment="Center" VerticalAlignment="Center" 
                               Padding="3 0 3 0" Background="Yellow"
                               Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text}"
                               Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=1}, Path=ActualWidth}" />
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Обновление: Замена самого внутреннего TextBox на ScrollViewer и присвоение ему имени PART_ContentHost действительно показывает курсор вставки текста.

Ответы [ 2 ]

4 голосов
/ 07 июня 2010

I предположим, причина в том, что в вашем шаблоне отсутствует элемент с именем PART_ContentElement. Как указано здесь , элемент с таким именем используется для отображения содержимого TextBox. Однако в версии этого документа v3.5 элемент называется PART_ContentHost и дополнительно ограничивается ScrollViewer или AdornerDecorator.

0 голосов
/ 07 июня 2010

Вы должны основывать свой стиль на старом стиле TextBox:

<Style x:Key="DemandEditStyle" TargetType="TextBox" BasedOn="{StaticResource {x:Type TextBox}}">
...