簡體   English   中英

光標鍵盤未顯示在文本框中

[英]cursor keyboard not showing on textbox

我有一個帶有水印的“geric”styleTextBox,它可以工作,但是當我通過命令行(textbox.focus();)請求此文本框的焦點時,他有一個背景黃色但光標鍵盤不顯示,但我可以更改文本值,我做錯了什么不顯示這個光標?

<Style x:Key="StyledTextBox" TargetType="{x:Type TextBox}" BasedOn="{StaticResource baseStyle}">
        <Setter Property="BorderBrush" Value="Black" />
        <Setter Property="BorderThickness" Value="1" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border x:Name="bg" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"
                            FocusManager.FocusedElement="{Binding ElementName=inputText}">
                        <Grid>
                            <TextBlock Text="{TemplateBinding Tag}" VerticalAlignment="Center" Margin="8,0,0,0">
                                <TextBlock.Visibility>
                                    <MultiBinding Converter="{StaticResource InputToVisibility}">
                                        <Binding ElementName="inputText" Path="Text.IsEmpty" />
                                        <Binding ElementName="inputText" Path="IsFocused" />
                                    </MultiBinding>
                                </TextBlock.Visibility>
                            </TextBlock>
                            <TextBox Name="inputText" Background="Transparent" BorderThickness="0"
                                    Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Text, UpdateSourceTrigger=PropertyChanged}"
                                    VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                                     />
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property=" IsFocused" Value=" true">
                            <Setter TargetName="bg" Property="BorderThickness" Value="5" />
                            <Setter TargetName="bg" Property="Background" Value="Yellow" />
                        </Trigger>
                        <Trigger Property="IsFocused" Value="false">
                            <Setter Property="Background" TargetName="bg" Value="red" />
                        </Trigger>
                    </ControlTemplate.Triggers>

                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

您的問題的根源是您將 TextBox 放在 TextBox 控件模板中並嘗試管理焦點。 這是一個不好的方法。

相反,您需要提取 TextBox 控件模板並通過添加水印元素和一些觸發器來修改它。

這是我正在談論的一個非常粗略的例子。 為了清楚起見,此 XAML 被截斷,但應該給您一個想法:

如果您看到...這就是其他 XAML 布局和/或觸發器所在的位置。

    <ControlTemplate x:Key="TextBoxTemplate" TargetType="{x:Type TextBox}">
        <Grid x:Name="RootElement"
            SnapsToDevicePixels="True"
            UseLayoutRounding="True">
                ...            
                <ScrollViewer x:Name="PART_ContentHost"
                    Padding="{TemplateBinding Padding}"
                    HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}"
                    VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}"
                    Background="Transparent"
                    BorderThickness="0"
                    Foreground="{TemplateBinding Foreground}" />
                <TextBlock x:Name="WatermarkElement"
                    Margin="{TemplateBinding Padding}"
                    HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                    VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                    Foreground="{TemplateBinding Foreground}"
                    Opacity="0.5"
                    Text="{Binding Path=Tag, RelativeSource={RelativeSource TemplatedParent}}"
                    Visibility="Collapsed" />
        </Grid>
        <ControlTemplate.Triggers>
            ...
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource StringLengthToBoolConverter}}" Value="false" />
                    <Condition Binding="{Binding Path=Tag, RelativeSource={RelativeSource Self}, Converter={StaticResource StringLengthToBoolConverter}}" Value="true" />
                    <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsKeyboardFocusWithin}" Value="false" />
                </MultiDataTrigger.Conditions>
                <Setter TargetName="WatermarkElement" Property="Visibility" Value="Visible" />
            </MultiDataTrigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>

我的示例使用了一個名為StringLengthToBoolConverter的值轉換器,它評估IsNullOrEmpty的字符串並返回truefalse

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM