• Silverlight搜索框 (Button inside TextBox)


    需要实现实现一个像下面那样很常见的搜索框,带提示信息,边角有按钮可点击。刚开始时准备通过样式拼凑,把一个简单的TextBox和Button组合在一起,但总不理想,后来找到一个很实用的第三方控件(RadControls for Silverlight)http://www.telerik.com/help/silverlight/introduction.html,很好地解决了我的问题。

    由于官方的introduction比较简单,而我另外在网上找到的一个Demo过于复杂,忘了链接:),故另外自己写了个简单的搜索框,希望对有需要的朋友有帮助。

    首先,引用Telerik.Windows.Controls.dll(在官网可下载),并声明 xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"

    全部Xaml文件:

     1 <UserControl x:Class="SearchButton.MainPage"
     2              xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     3              xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     4              xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     5              xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     6              xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" 
     7              mc:Ignorable="d"
     8              d:DesignHeight="300" d:DesignWidth="400">
     9     <UserControl.Resources>
    10 
    11         <!--SearchButton Style-->
    12         <Style TargetType="telerik:RadButton" x:Key="SearchButton">
    13             <Setter Property="Template">
    14                 <Setter.Value>
    15                     <ControlTemplate>
    16                         <Grid Margin="0 0 0 0" Background="Transparent"  Cursor="Hand">
    17                             <Path Fill="#FF474747"  Stretch="Fill" StrokeThickness="0"  Height="11.8"  Width="10" UseLayoutRounding="False"
    18                              Data="M4.5,1 C2.6,1 1,2.6 1,4.5 C1,6.5 2.6,8 4.5,8 C6.5,8 8,6.5 8,4.5 C8,2.6 6.5,1 4.5,1 z M4.5,0 C7,0 9,2 9,4.5 C9,5.8 8.5,7 7.7,7.8 L7.6,7.8 L8,7.8 L8,8.8 L9,8.8 L9,9.8 L10,9.8 L10,10.8 L10,11.8 L9,11.8 L9,10.8 L8,10.8 L8,9.8 L7,9.8 L7,8.8 L6,8.8 L6,8.8 L6,8.8 C5.5,9 5,9 4.5,9 C2,9 0,7 0,4.5 C0,2 2,0 4.5,0 z" />
    19                         </Grid>
    20                     </ControlTemplate>
    21                 </Setter.Value>
    22             </Setter>
    23         </Style>
    24 
    25         <!--RadWatermarkTextBoxStyle-->
    26         <Style x:Key="RadWatermarkTextBoxStyle" TargetType="telerik:RadWatermarkTextBox">
    27             <Setter Property="Template">
    28                 <Setter.Value>
    29                     <ControlTemplate TargetType="telerik:RadWatermarkTextBox">
    30                         <Grid>
    31                             <Grid.ColumnDefinitions>
    32                                 <ColumnDefinition Width="*" />
    33                                 <ColumnDefinition Width="Auto" />
    34                             </Grid.ColumnDefinitions>
    35                             <!--控件样式-->
    36                             <Border x:Name="Border" Grid.ColumnSpan="2" BorderBrush="#FF8D8D8D" BorderThickness="1" Opacity="1" Background="AliceBlue"  />
    37                             <!--控件元素-->
    38                             <ScrollViewer x:Name="ContentElement"  Grid.ColumnSpan="2" BorderThickness="0" IsTabStop="False"   />
    39                             <!--SearchButton-->
    40                             <telerik:RadButton Grid.Column="1" Margin="5 3" Click="RadButton_Click" Style="{StaticResource SearchButton}" />
    41                         </Grid>
    42                     </ControlTemplate>
    43                 </Setter.Value>
    44             </Setter>
    45         </Style>
    46 
    47         <!--RadButtonStyle-->
    48         <Style x:Key="RadButtonStyle"  TargetType="telerik:RadButton">
    49             <Setter Property="Template">
    50                 <Setter.Value>
    51                     <ControlTemplate TargetType="telerik:RadButton">
    52                         <Grid>
    53                             <!--RadWatermarkTextBox element-->
    54                             <telerik:RadWatermarkTextBox Grid.Column="1"  x:Name="WatermarkTextBox"  Text="{TemplateBinding Content}"  Grid.Row="1" Background="#FFFFFF" Style="{StaticResource RadWatermarkTextBoxStyle}" />
    55                         </Grid>
    56                     </ControlTemplate>
    57                 </Setter.Value>
    58             </Setter>
    59         </Style>
    60 
    61     </UserControl.Resources>
    62 
    63     <Grid x:Name="LayoutRoot"  Background="White">
    64         <telerik:RadButton  x:Name="SearchTextBox" HorizontalAlignment="Center"  VerticalAlignment="Center"  Content="请输入查询条件" Width="200"
    65                                    Style="{StaticResource RadButtonStyle}" Margin="3,0,3,5" />
    66     </Grid>
    67 </UserControl>

    供点击的那个查询按钮命令是在 RadWatermarkTextBoxStyle→SearchButton。

    得到的界面如下:

    最后一个问题是,后台代码。本来,这个写法就是WatermarkTextBox,当点击时,里面的提示信息“请输入查询条件”应该消失的,但现在就是不消失。可能是用作Style资源的缘故,我还弄不清,求解……

    但既然Xaml样式控制实现不了,只好转到后台代码实现“水印”效果了。

    详细的后台代码:

    using System.Globalization;
    using System.Windows;
    using System.Windows.Controls;
    using Telerik.Windows.Controls;
    
    namespace SearchButton
    {
        public partial class MainPage : UserControl
        {
            private string _searchBoxTips;
            internal RadButton MySearchTextBox;
    
            public MainPage()
            {
                InitializeComponent();
    
                MySearchTextBox = this.SearchTextBox ;
    
                _searchBoxTips = SearchTextBox.Content.ToString();
    
                SearchTextBox.GotFocus -= OnSearchTextBoxGotFocus;
                SearchTextBox.GotFocus += OnSearchTextBoxGotFocus;
                SearchTextBox.LostFocus -= OnSearchTextBoxLostFocus;
                SearchTextBox.LostFocus += OnSearchTextBoxLostFocus;
    
            }
    
            /// <summary>
            /// 查询TextBox获得焦点
            /// </summary>
            /// <param name="sender">TextBox</param>
            /// <param name="e"></param>
            private void OnSearchTextBoxGotFocus(object sender, RoutedEventArgs e)
            {
                var tb = SearchTextBox.FindChildByType<RadWatermarkTextBox>();
    
                var tbString = tb.Text.ToString(CultureInfo.InvariantCulture);
    
                if (tbString == _searchBoxTips)
                {
                    tb.Text = "";
                }
            }
    
            /// <summary>
            ///  查询TextBox失去焦点
            /// </summary>
            /// <param name="sender">TextBox</param>
            /// <param name="e"></param>
            private void OnSearchTextBoxLostFocus(object sender, RoutedEventArgs e)
            {
                var tb = SearchTextBox.FindChildByType<RadWatermarkTextBox>();
                var tbString = tb.Text.ToString(CultureInfo.InvariantCulture);
    
                if (string.IsNullOrEmpty(tbString))
                {
                    tb.Text = _searchBoxTips;
                }
            }
    
    
            private void RadButton_Click(object sender, RoutedEventArgs e)
            {
                var tbString = SearchTextBox.FindChildByType<RadWatermarkTextBox>().Text.ToString(CultureInfo.InvariantCulture);
    
                if (string.IsNullOrWhiteSpace(tbString) || tbString == _searchBoxTips)
                {
                    return;
                }
    
                MessageBox.Show(tbString);
            }
        }
    }

    运行:

  • 相关阅读:
    lua 中的上n级模块路径函数分享
    [poj 1062] 昂贵的聘礼
    [poj 2479] Maximum sum -- 转载
    IT界天才少年:比肩雷军、叫板任正非,自己作死了
    chromedriver版本 支持的Chrome版本
    运维开发:python websocket网页实时显示远程服务器日志信息
    JVM理论:(三/4)方法调用
    JVM理论:(三/3)运行时栈帧结构、基于栈的字节码解释执行过程
    JVM理论:(三/2)字节码指令
    JVM理论:(三/1)class类文件结构
  • 原文地址:https://www.cnblogs.com/oneivan/p/2584919.html
Copyright © 2020-2023  润新知