After seeing a tweet about the lack of a clearable text box similar to the IPhone by Eric Malamisura, I was inspired to whip together a simple control that fills this need.
Here is some code for the control, in case you don't want to download the full example. Just create a new UserControl called ClearableEditBox and paste these parts in the relevant places.
<!-- Put inside your new UserControl -->
<Grid x:Name="LayoutRoot">
<TextBox
MinWidth="50"
Text="{Binding ElementName=uiThis, Path=Text, Mode=TwoWay}"
x:Name="editBox"/>
<Button
MinWidth="30"
HorizontalAlignment="Right"
VerticalAlignment="Center"
Click="clrBtn_Click"
x:Name="clrBtn">
<Button.Template>
<ControlTemplate>
<TextBlock
FontSize="25"
Margin="0 0 20 0"
Foreground="Gray"
FontWeight="Bold"
Text="X"/>
</ControlTemplate>
</Button.Template>
</Button>
</Grid>
// Put inside your code behind for your new UserControl.
public partial class ClearableTextBox : UserControl, INotifyPropertyChanged
{
public string Text
{
get { return (string)GetValue(TextProperty); }
set { SetValue(TextProperty, value); }
}
// Using a DependencyProperty as the backing store for EditText. This enables animation, styling, binding, etc...
public static readonly DependencyProperty TextProperty =
DependencyProperty.Register("Text", typeof(string), typeof(ClearableTextBox), new PropertyMetadata(string.Empty, HandleTextChanged));
public ClearableTextBox()
{
InitializeComponent();
}
private static void HandleTextChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
var box = obj as ClearableTextBox;
if (null != box)
box.OnPropertyChanged("Text");
}
private void clrBtn_Click(object sender, RoutedEventArgs e)
{
Text = string.Empty;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string name)
{
if (null != PropertyChanged)
PropertyChanged(null, new PropertyChangedEventArgs(name));
}
#endregion
}
You can also download a sample project containing the control here.
Clearable TextBox UserControl
Now Playing: Eminem - Airplanes

Hi,
ReplyDeleteI hope that you accept a constructive comment ;) For this kind of component, I would rather use a custom control rather than a user control. This reduces the skinnability of your control. A custom control with a template makes it easier to create a new template for the component and change its appearance completely (for example provide a different button to clear the content).
Of course, user control vs custom control is often a matter of personal taste, but I thought I would mention it ;)
Cheers,
Laurent
@LBugnion
ReplyDeleteI agree. I think I'm going to put a custom control version together shortly. I'll update the post when that happens. It'll be a good intro for me into Custom Controls.
The user control version did end up being a pretty small undertaking though, and I was aiming to get something out pretty quick in response to the tweet.
Youur the best
ReplyDelete