WPF在visualtree上传播GotFocus

时间:2014-07-23 15:45:13

标签: c# wpf

我有这个样式模板

    <Style x:Key="placeHolder" 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" 
                             Background="Transparent" 
                             Focusable="True"
                             Panel.ZIndex="2">                            
                    </TextBox>
                    <TextBox Text="{TemplateBinding Tag}" Background="{TemplateBinding Background}" Panel.ZIndex="1">
                        <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="LightGray"/>
                                    </DataTrigger>                                         
                                </Style.Triggers>
                            </Style>
                        </TextBox.Style>
                    </TextBox>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

并且在自定义控件中有一个使用此模板的场景:

<TextBox x:Name="DatoABuscar" 
            Height="Auto" 
            MinHeight="25" 
            Text="{Binding Filtro,UpdateSourceTrigger=PropertyChanged}" 
            Margin="1,1,1,0" 
            PreviewKeyDown="DatoABuscar_PreviewKeyDown" 
            VerticalAlignment="Center"
            Style="{StaticResource placeHolder}"
            Tag="{x:Static resources:Labels.CONTROLES_SearchPlaceHoderText}"
            GotFocus="DatoABuscar_GotFocus"/>

冷静地看到我有一个带有此代码的 GotFocus 处理程序:

private void DatoABuscar_GotFocus(object sender, RoutedEventArgs e)
{
    ((TextBox)sender).SelectAll();        
}

这个句柄很完美,我假装在GotFocus发生时选择文本框的所有内容,但是如果我理解在GotFocus发生之后显示的真实文本框是 textSource 内部的样式模板。

现在我的问题是什么?

  1. 如何将 DatoAbuscar 收到的重点传播到 textSource ? 或
  2. 如何访问 DatoABuscar 下的visualtree以获取 textSource ? 或
  3. DatoAbuscar 收到GotFocus **时,如何选择 textSource 中的所有文字?
  4. 另一个方法?

    编辑:我完全错了,问题不在于我选择文字的TexBox。我的问题是选择文本的方法。最后,我实施了This Post

1 个答案:

答案 0 :(得分:1)

实际上你只需要使用FindName来找到&#34; textSource&#34;。

private void DatoABuscar_GotFocus(object sender, RoutedEventArgs e)
{
    var txt = sender as TextBox;
    var innerTxt = txt.Template.FindName("textSource", txt) as TextBox;
    Keyboard.Focus(innerTxt);
    innerTxt.SelectAll();
}