模板TextBox

时间:2017-01-20 10:51:14

标签: c# wpf xaml wpf-style

我的一个观点中有以下TextBox:

<TextBox Name="SearchTerm" Style="{StaticResource SearchTermTextBoxStyle}"
         Text="{Binding TemplatesViewModel.SearchTerm, Mode=OneWayToSource, UpdateSourceTrigger=PropertyChanged}"
         attachedProperties:Watermark.Watermark="Some watermark text"
         KeyboardNavigation.TabIndex="5" />

如您所见,已应用以下样式:

<Style x:Key="SearchTermTextBoxStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type TextBox}">
                <Grid>
                    <TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" />
                    <TextBlock Text="{Binding (attachedProperties:Watermark.Watermark), Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" x:Name="DefaultTextPrompt"
                           Foreground="#888888" FontStyle="Italic" HorizontalAlignment="Left"
                           VerticalAlignment="Center" IsHitTestVisible="False" Visibility="Hidden"
                           Margin="5,-1,0,0" />
                </Grid>
                <ControlTemplate.Triggers>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="Text" Value="" />
                            <Condition Property="IsKeyboardFocusWithin" Value="False" />
                        </MultiTrigger.Conditions>
                        <Setter Property="Visibility" TargetName="DefaultTextPrompt" Value="Visible" />
                    </MultiTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

问题是当我获得对SearchTerm TextBox的关注时,光标根本不会出现。首先我想到的是简单的结论:可能我只是逻辑焦点,而不是键盘焦点。但事实并非如此。我可以自由地将一些文本输入到TextBox中,但我仍然没有得到光标。当我使用鼠标左键进入此TextBox时,光标出现并按预期闪烁 那么我的TextBox有什么问题?

1 个答案:

答案 0 :(得分:0)

问题出在放在TextBox的{​​{1}}内的TextBox控件上。我想当您专注于{父} ControlTemplate时,它不会关注TextBox的{​​{1}}。

使用左键单击时,它直接进入ControlTemplate的{​​{1}},因此光标闪烁。

如果您注意到TextBox的原始(默认)ControlTemplate,它使用TextBox来托管内容,所以我建议您更改

TextBox

ControlTemplate

这将自动显示ScrollViewer中的<TextBox Text="{Binding Text, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}, UpdateSourceTrigger=PropertyChanged}" /> 。另外,您也可以专注于{parent} <ScrollViewer x:Name="PART_ContentHost" Focusable="False" />