Первый TextBox не показывает курсор и не может ничего печатать, если используется кнопка табуляции в XAML - PullRequest
0 голосов
/ 13 апреля 2020

Сначала у меня есть текстовое поле, затем поле пароля, затем поле подтверждения пароля. Если я использую только вкладку для перемещения между этими полями, то первое текстовое поле не позволяет мне печатать что-либо, так как я не вижу на нем никакого курсора. Но для следующего пароля и подтверждения пароля я могу использовать вкладку для переключения, тип и курсор также видны. Я хочу, чтобы первое текстовое поле могло работать так же, как поле ввода пароля. Я использую XAML. Вот код Любая помощь будет полезна. Спасибо. PS: не работает с "****", который вы видите в коде.

TextBox x:Name="txtUsername"
                    TabIndex="1"
                         x:Uid="*****"
                         Tag="Username"
                     Style="{DynamicResource placeHolderMandatory}"
                         ctrl:PlaceHolderHelper.PlaceHolderText="Username *"
          VerticalContentAlignment="Center"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
                     Focusable="False"
                     IsTabStop="False"
                     KeyUp="credentialKeyUp" 
          Width="402"  Margin="5,5,5.4,25"  />

<PasswordBox x:Name="newPassword"
          x:Uid="****"
           TabIndex="2"
                         KeyUp="credentialKeyUp"
          VerticalContentAlignment="Center"
          HorizontalAlignment="Left"
          VerticalAlignment="Top"
          Width="402"  Margin="5,5,5.4,25" 
                         ctrl:PasswordPlaceHolderHelper.PlaceHolderText="Password     (must be atleast 8 characters in length)" 
                         ctrl:PasswordPlaceHolderHelper.MandatoryPlaceHolderText="Password *" 
                         Style="{DynamicResource PasswordPlaceHolder}"/>

<PasswordBox x:Name="confirmPassword" 
          x:Uid="*****"
          TabIndex="3"
          VerticalContentAlignment="Center"
          HorizontalAlignment="Left"
                         KeyUp="credentialKeyUp"
          VerticalAlignment="Top"
          Width="402"  Margin="5,5,5.4,25" 
                         ctrl:PasswordPlaceHolderHelper.PlaceHolderText="Confirm Password"
                         ctrl:PasswordPlaceHolderHelper.MandatoryPlaceHolderText="Confirm Password *" 
                         Style="{DynamicResource PasswordPlaceHolder}" />

, а код стиля: код стиля текстового поля:

<Style x:Key="placeHolderMandatory" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
         <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <TextBox Text="{Binding Path=Text,
                                                RelativeSource={RelativeSource TemplatedParent}, 
                                                Mode=TwoWay,
                                                UpdateSourceTrigger=PropertyChanged}"
                                 x:Name="textSource" 
                                 Width="{TemplateBinding Width}" IsTabStop="False" Focusable="True"
                                 Background="Transparent" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                                 Panel.ZIndex="3" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" MaxLength="{TemplateBinding MaxLength}"
                                 Height="{TemplateBinding Height}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" TabIndex="{TemplateBinding TabIndex}" />

                        <TextBox Text="{TemplateBinding Tag}" Background="Transparent" BorderThickness="{TemplateBinding BorderThickness}" Height="{TemplateBinding Height}"
                                 BorderBrush="{DynamicResource TextBoxBorderColorBrush}"  IsReadOnly="True" IsTabStop="False"
                                 Width="{TemplateBinding Width}"  VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                                 FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" Panel.ZIndex="2"  TabIndex="500">
                            <TextBox.Style>
                                <Style TargetType="{x:Type TextBox}">
                                    <Setter Property="Foreground" Value="Transparent"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">
                                            <Setter Property="Foreground" Value="Gray"/>
                                            <Setter Property="HorizontalContentAlignment" Value="Left"/>
                                            <Setter Property="VerticalContentAlignment" Value="Center"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                        <TextBox Text="{TemplateBinding local:PlaceHolderHelper.PlaceHolderText}"  VerticalAlignment="{TemplateBinding VerticalAlignment}"
                                 Background="{TemplateBinding Background}" Panel.ZIndex="1"  Height="{TemplateBinding Height}" IsReadOnly="True" IsTabStop="False"
                                 BorderThickness="{TemplateBinding BorderThickness}" FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" TabIndex="501">
                            <TextBox.Style>
                                <Style TargetType="{x:Type TextBox}">
                                    <Setter Property="Foreground" Value="Transparent"/>
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">
                                            <Setter Property="Foreground" Value="Red"/>
                                            <Setter Property="HorizontalContentAlignment" Value="Left"/>
                                            <Setter Property="VerticalContentAlignment" Value="Center"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBox.Style>
                        </TextBox>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

1 Ответ

0 голосов
/ 13 апреля 2020

Я думаю, вам нужно удалить Focusable="False", а также IsTabStop="False" с первого ввода. Тогда это должно сработать (по крайней мере, для меня)

. Focusable="False" вообще не позволяет полю фокусироваться (также не нажатием клавиши табуляции), в то время как IsTabStop="False" не позволяет выбрать его с помощью табуляции.

Редактировать: Я думаю, что прозрачный передний план скрывает курсор, поэтому удалите эту строку в своем стиле, если вы хотите, чтобы курсор показывал.

Редактировать 2: вы можете использовать этот стиль для реализации заполнителя вместо текста:

<Style x:Key="PlaceholderStyle" TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="IsFocused" Value="False">
                <Setter Property="Text" Value="{Binding RelativeSource={RelativeSource Self}, Path=Tag}"/>
            </Trigger>

        </Style.Triggers>
    </Style>

С помощью этого кода просто напишите текст метки-заполнителя в теге (как вы это сделали), и вы хороши для go. Конечно, вы можете добавить другие сеттеры к стилю и к триггеру (например, чтобы сделать заполнитель серым, но обычный текст прозрачным).

...