WPF 自定义搜索框

 

控件中的搜索图标下载地址:http://www.easyicon.net/1183666-Search_icon.html

搜索框设计过程比较简单:

1、先定义一个Rectangle作为背景

2、然后中间放TextBox输入,可以重写其中的模板。提示语Label放在模板中,可以在模板的触发器中控制隐藏显示~

3、搜索按钮-大家随便在网上下个就行了。

UserControl界面:

<UserControl x:Class="WpfApplication18.SearchControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" MinHeight="30" MinWidth="150" Background="Transparent"
             d:DesignHeight="30" d:DesignWidth="150">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="15">ColumnDefinition>
            <ColumnDefinition Width="*">ColumnDefinition>
            <ColumnDefinition Width="36">ColumnDefinition>
        Grid.ColumnDefinitions>
        <Rectangle Grid.Column="0" Grid.ColumnSpan="3" Fill="LightGray" RadiusX="15" RadiusY="15" Opacity="0.8">Rectangle>
        
        <TextBox x:Name="TbxInput" Grid.Column="1" KeyDown="TbxInput_OnKeyDown">
            <TextBox.Template>
                <ControlTemplate TargetType="TextBox">
                    <Grid>
                        <TextBlock x:Name="Uc_TblShow" Text="请输入..." Foreground="Gray" Opacity="0.5" VerticalAlignment="Center" Visibility="Collapsed">TextBlock>
                        <TextBox x:Name="Uc_TbxContent" Foreground="Gray" Background="Transparent" VerticalAlignment="Center" VerticalContentAlignment="Center" BorderThickness="0"
                                 Text="{Binding ElementName=TbxInput,Path=Text,Mode=TwoWay}" FontSize="18">TextBox>
                    Grid>
                    <ControlTemplate.Triggers>
                        <Trigger SourceName="Uc_TbxContent" Property="Text" Value="">
                            <Setter TargetName="Uc_TblShow" Property="Visibility" Value="Visible">Setter>
                        Trigger>
                        <Trigger SourceName="Uc_TbxContent" Property="IsFocused" Value="True">
                            <Setter TargetName="Uc_TblShow" Property="Visibility" Value="Collapsed">Setter>
                        Trigger>
                    ControlTemplate.Triggers>
                ControlTemplate>
            TextBox.Template>
        TextBox>
        
        <Button x:Name="BtnSearch" Grid.Column="2" Click="BtnSearch_OnClick" Cursor="Hand">
            <Button.Template>
                <ControlTemplate TargetType="Button">
                    <Grid>
                        <Image x:Name="Uc_Image" Source="1181298.png" Height="20" Width="20">Image>
                        <ContentPresenter>ContentPresenter>
                    Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="Uc_Image" Property="Height" Value="25">Setter>
                            <Setter TargetName="Uc_Image" Property="Width" Value="25">Setter>
                        Trigger>
                    ControlTemplate.Triggers>
                ControlTemplate>
            Button.Template>
        Button>
    Grid>
UserControl>
View Code

UserControl后台:

    public partial class SearchControl : UserControl
    {
        public SearchControl()
        {
            InitializeComponent();
        }

        public event EventHandler OnSearch; 
        private void BtnSearch_OnClick(object sender, RoutedEventArgs e)
        {
            ExeccuteSearch();
        }

        private void TbxInput_OnKeyDown(object sender, KeyEventArgs e)
        {
            ExeccuteSearch();
        }

        private void ExeccuteSearch()
        {
            if (OnSearch!=null)
            {
                var args=new SearchEventArgs();
                args.SearchText = TbxInput.Text;
                OnSearch(this, args);
            }
        }
    }
    public class SearchEventArgs : EventArgs
    {
        public string SearchText { get; set; }
    }
View Code

直接引用就行了:

 

附TextBox的水印效果样式

<Style x:Key="TextBoxStyle" TargetType="{x:Type TextBox}">
                <Style.Triggers>
                    <Trigger Property="IsFocused" Value="True">
                        <Setter  Property="Background" Value="#5FCBCBCB" />
                    Trigger>
                    <MultiTrigger>
                        <MultiTrigger.Conditions>
                            <Condition Property="IsFocused" Value="False"/>
                            <Condition Property="Text" Value=""/>
                        MultiTrigger.Conditions>
                        <MultiTrigger.Setters>
                            <Setter Property="Background">
                                <Setter.Value>
                                    <VisualBrush Opacity="0.4" Stretch="None">
                                        <VisualBrush.Visual>
                                            <TextBlock FontSize="12" HorizontalAlignment="Center" VerticalAlignment="Center" Text="输入内容" />
                                        VisualBrush.Visual>
                                    VisualBrush>
                                Setter.Value>
                            Setter>
                        MultiTrigger.Setters>
                    MultiTrigger>
                Style.Triggers>
            Style>

 

你可能感兴趣的:(WPF 自定义搜索框)