132 votes

Comment puis-je ajouter un soupçon de texte à WPF zone de texte?

Par exemple, Facebook a une "Recherche" astuce du texte dans la zone de texte de Recherche lorsque la zone de texte est vide.

Comment réaliser cela avec WPF zones de texte??

Facebook's search textbox

185voto

sellmeadog Points 3431

Vous pouvez accomplir beaucoup plus facilement avec un VisualBrush et certains déclencheurs en Style:

<TextBox>
    <TextBox.Style>
        <Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib">
            <Style.Resources>
                <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
                    <VisualBrush.Visual>
                        <Label Content="Search" Foreground="LightGray" />
                    </VisualBrush.Visual>
                </VisualBrush>
            </Style.Resources>
            <Style.Triggers>
                <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
                    <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                </Trigger>
                <Trigger Property="Text" Value="{x:Null}">
                    <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                </Trigger>
                <Trigger Property="IsKeyboardFocused" Value="True">
                    <Setter Property="Background" Value="White" />
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

Pour augmenter la ré-utilisabilité de ce Style, vous pouvez également créer un ensemble de propriétés attachées à contrôle le réel de repère bannière de texte, la couleur, l'orientation, etc.

9voto

mxgg250 Points 237

Le faire dans le code-behind en définissant la couleur du texte, initialement, de gris et ajouter des gestionnaires d'événements pour gagner et perdre le focus du clavier.

TextBox tb = new TextBox();
tb.Foreground = Brushes.Gray;
tb.Text = "Text";
tb.GotKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_GotKeyboardFocus);
tb.LostKeyboardFocus += new KeyboardFocusChangedEventHandler(tb_LostKeyboardFocus);

Ensuite, les gestionnaires d'événements:

private void tb_GotKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    if(sender is TextBox)
    {
        //If nothing has been entered yet.
        if(((TextBox)sender).Foreground == Brushes.Gray)
        {
            ((TextBox)sender).Text = "";
            ((TextBox)sender).Foreground = Brushes.Black;
        }
    }
}


private void tb_LostKeyboardFocus(object sender, KeyboardFocusChangedEventArgs e)
{
    //Make sure sender is the correct Control.
    if(sender is TextBox)
    {
        //If nothing was entered, reset default text.
        if(((TextBox)sender).Text.Trim().Equals(""))
        {
            ((TextBox)sender).Foreground = Brushes.Gray;
            ((TextBox)sender).Text = "Text";
        }
    }
}

5voto

Kishore Kumar Points 8636

vous avez créer un contrôle personnalisé par hériter de la zone de texte. Ci-dessous le lien est un excellent exemple sur la zone de texte recherche de l'échantillon. Jetez un oeil à cette

http://davidowens.wordpress.com/2009/02/18/wpf-search-text-box/

0voto

TeamGB Points 213

J'ai utilisé le got et le foyer perdu événements:

Private Sub txtSearchBox_GotFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtSearchBox.GotFocus
    If txtSearchBox.Text = "Search" Then
        txtSearchBox.Text = ""
    Else

    End If

End Sub

Private Sub txtSearchBox_LostFocus(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles txtSearchBox.LostFocus
    If txtSearchBox.Text = "" Then
        txtSearchBox.Text = "Search"
    Else

    End If
End Sub

Il fonctionne bien, mais le texte est en gris encore. Les besoins de nettoyage. J'ai été en utilisant VB.NET

-1voto

SUHAIL AG Points 1

- Je y arriver avec un VisualBrush et certains déclencheurs en Style proposé par :sellmeadog.

<TextBox>
        <TextBox.Style>
            <Style TargetType="TextBox" xmlns:sys="clr-namespace:System;assembly=mscorlib">
                <Style.Resources>
                    <VisualBrush x:Key="CueBannerBrush" AlignmentX="Left" AlignmentY="Center" Stretch="None">
                        <VisualBrush.Visual>
                            <Label Content="Search" Foreground="LightGray" />
                        </VisualBrush.Visual>
                    </VisualBrush>
                </Style.Resources>
                <Style.Triggers>
                    <Trigger Property="Text" Value="{x:Static sys:String.Empty}">
                        <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                    </Trigger>
                    <Trigger Property="Text" Value="{x:Null}">
                        <Setter Property="Background" Value="{StaticResource CueBannerBrush}" />
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="True">
                        <Setter Property="Background" Value="White" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </TextBox.Style>
    </TextBox>

@sellmeadog :Application en cours d'exécution, bt Conception de pas de chargement...l'Erreur suivante: Ambigu type de référence. Un type nommé "StaticExtension" se produit dans au moins deux espaces de noms, 'MME Internes.Les métadonnées.ExposedTypes.Xaml et du Système.De Windows.Balisage'. Envisager l'ajustement de l'assemblée XmlnsDefinition attributs. m 'aide .net 3.5

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X