需要实现实现一个像下面那样很常见的搜索框,带提示信息,边角有按钮可点击。刚开始时准备通过样式拼凑,把一个简单的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); } } }
运行: