[英]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
的字符串並返回true
或false
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.