【WPF系列】Textbox
Style定义实例
给Textbox定义一个阴影效果。
- <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
- <Setter Property="SnapsToDevicePixels" Value="True"/>
- <Setter Property="OverridesDefaultStyle" Value="True"/>
- <Setter Property="KeyboardNavigation.TabNavigation" Value="None"/>
- <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
- <Setter Property="MinWidth" Value="120"/>
- <Setter Property="MinHeight" Value="20"/>
- <Setter Property="AllowDrop" Value="true"/>
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="{x:Type TextBoxBase}">
- <Border x:Name="Border"
- BorderThickness="1"
- CornerRadius="2"
- Padding="0">
- <Border.BorderBrush>
- <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
- <GradientStop Color="#888888" Offset="0" />
- <GradientStop Color="#AAAAAA" Offset=".2" />
- </LinearGradientBrush>
- </Border.BorderBrush>
- <ScrollViewer x:Name="PART_ContentHost" Margin="0">
- <ScrollViewer.Background>
- <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
- <GradientStop Offset="0" Color="WhiteSmoke"/>
- <GradientStop Offset="1" Color="LightGray"/>
- </LinearGradientBrush>
- </ScrollViewer.Background>
- </ScrollViewer>
- </Border>
- <ControlTemplate.Triggers>
- <Trigger Property="IsEnabled" Value="False">
- <Setter TargetName="Border" Property="Background" Value="#EEEEEE"/>
- <Setter TargetName="Border" Property="BorderBrush" Value="#EEEEEE"/>
- <Setter Property="Foreground" Value="#888888"/>
- </Trigger>
- </ControlTemplate.Triggers>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
UpdateSourceTrigger
默认UpdateSourceTrigger为LostFoucs,有时需要及时CommitValue,则需要设置为PropertyChanged。这样当Text属性的值发生变化时,我们的值就能及时更新到Datasource中。
更多参考
How to: Control When the TextBox Text Updates the Source
NumberTextbox
- 使用NubmberTextboxBehavior
- 将TextBox的binding属性中Delay设置为1000
- <Binding Path="UpperLeftCornerLatitude" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" Delay="1000">
- </Binding>
- //NumericTextBoxBehavior
- /// <summary>
- /// This forces a TextBoxBase control to be numeric-entry only
- /// </summary>
- /// <example>
- /// <![CDATA[ <TextBox Cinch:NumericTextBoxBehavior.IsEnabled="True" /> ]]>
- /// </example>
- public static class NumericTextBoxBehavior
- {
- #region IsEnabled DP
- /// <summary>
- /// Dependency Property for turning on numeric behavior in a TextBox.
- /// </summary>
- public static readonly DependencyProperty IsEnabledProperty =
- DependencyProperty.RegisterAttached("IsEnabled",
- typeof(bool), typeof(NumericTextBoxBehavior),
- new UIPropertyMetadata(false, OnEnabledStateChanged));
- /// <summary>
- /// Attached Property getter for the IsEnabled property.
- /// </summary>
- /// <param name="source">Dependency Object</param>
- /// <returns>Current property value</returns>
- public static bool GetIsEnabled(DependencyObject source)
- {
- return (bool)source.GetValue(IsEnabledProperty);
- }
- /// <summary>
- /// Attached Property setter for the IsEnabled property.
- /// </summary>
- /// <param name="source">Dependency Object</param>
- /// <param name="value">Value to set on the object</param>
- public static void SetIsEnabled(DependencyObject source, bool value)
- {
- source.SetValue(IsEnabledProperty, value);
- }
- /// <summary>
- /// This is the property changed handler for the IsEnabled property.
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private static void OnEnabledStateChanged(DependencyObject sender,
- DependencyPropertyChangedEventArgs e)
- {
- TextBox tb = sender as TextBox;
- if (tb == null)
- return;
- tb.PreviewTextInput -= tbb_PreviewTextInput;
- DataObject.RemovePastingHandler(tb, OnClipboardPaste);
- bool b = ((e.NewValue != null && e.NewValue.GetType() == typeof(bool))) ?
- (bool)e.NewValue : false;
- if (b)
- {
- tb.PreviewTextInput += tbb_PreviewTextInput;
- DataObject.AddPastingHandler(tb, OnClipboardPaste);
- }
- }
- #endregion
- #region Private Methods
- /// <summary>
- /// This method handles paste and drag/drop events
- /// onto the TextBox. It restricts the character
- /// set to numerics and ensures we have consistent behavior.
- /// </summary>
- /// <param name="sender">TextBox sender</param>
- /// <param name="e">EventArgs</param>
- private static void OnClipboardPaste(object sender, DataObjectPastingEventArgs e)
- {
- TextBox tb = sender as TextBox;
- string text = e.SourceDataObject.GetData(e.FormatToApply) as string;
- if (tb != null && !string.IsNullOrEmpty(text) && !Validate(tb, text))
- e.CancelCommand();
- }
- /// <summary>
- /// This checks if the resulting string will match the regex expression
- /// </summary>
- static void tbb_PreviewTextInput(object sender, TextCompositionEventArgs e)
- {
- TextBox tb = sender as TextBox;
- if (tb != null && !Validate(tb, e.Text))
- e.Handled = true;
- }
- #endregion
- private static bool Validate(TextBox tb, string newContent)
- {
- string testString = string.Empty;
- // replace selection with new text.
- if (!string.IsNullOrEmpty(tb.SelectedText))
- {
- string pre = tb.Text.Substring(0, tb.SelectionStart);
- string after = tb.Text.Substring(tb.SelectionStart + tb.SelectionLength,
- tb.Text.Length - (tb.SelectionStart + tb.SelectionLength));
- testString = pre + newContent + after;
- }
- else
- {
- string pre = tb.Text.Substring(0, tb.CaretIndex);
- string after = tb.Text.Substring(tb.CaretIndex,
- tb.Text.Length - tb.CaretIndex);
- testString = pre + newContent + after;
- }
- Regex regExpr = new Regex(@"^([-+]?)(\d*)([,.]?)(\d*)$");
- if (regExpr.IsMatch(testString))
- return true;
- return false;
- }
- }
WaterMark/HintText/PlaceHoder
- 通过Style
- 通过AttachBehavior
- 通过自定义控件
1.给TextBox添加水印效果(提示文字)
- <!--Add a placeHolder for TextBox using Tag value-->
- <Style x:Key="placeHolder" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
- <Setter Property="Template">
- <Setter.Value>
- <ControlTemplate TargetType="{x:Type TextBox}">
- <Grid>
- <TextBox Text="{Binding Path=Text,
- RelativeSource={RelativeSource TemplatedParent},
- Mode=TwoWay,
- UpdateSourceTrigger=PropertyChanged,
- Delay=1000}"
- x:Name="textSource"
- Background="Transparent"
- Panel.ZIndex="2" />
- <TextBox Text="{TemplateBinding Tag}" Background="{TemplateBinding Background}" Panel.ZIndex="1">
- <TextBox.Style>
- <Style TargetType="{x:Type TextBox}">
- <Setter Property="Foreground" Value="Transparent" />
- <Style.Triggers>
- <DataTrigger Binding="{Binding Path=Text, Source={x:Reference textSource}}" Value="">
- <Setter Property="Foreground" Value="LightGray" />
- </DataTrigger>
- </Style.Triggers>
- </Style>
- </TextBox.Style>
- </TextBox>
- </Grid>
- </ControlTemplate>
- </Setter.Value>
- </Setter>
- </Style>
2.通过AttachBehavior
3.通过自定义控件
参考
WPF validation rule preventing decimal entry in textbox?
Set WPF Binding.StringFormat Property on TextBox via Style
【WPF系列】Textbox的更多相关文章
- [WPF系列]-数据邦定之DataTemplate 对分层数据的支持
到目前为止,我们仅讨论如何绑定和显示单个集合. 某些时候,您要绑定的集合包含其他集合. HierarchicalDataTemplate 类专用于 HeaderedItemsControl 类型以显示 ...
- [WPF系列]-数据邦定之DataTemplate 根据对象属性切换模板
引言 书接上回[WPF系列-数据邦定之DataTemplate],本篇介绍如何根据属性切换模板(DataTemplate) 切换模板的两种方式: 使用DataTemplateSelecto ...
- [WPF系列]-DataBinding(数据绑定) 自定义Binding
自定义Binding A base class for custom WPF binding markup extensions BindingDecoratorBase Code: public c ...
- [WPF系列]-TreeView的常用事项
引言 项目经常会用Treeview来组织一些具有层级结构的数据,本节就将项目使用Treeview常见的问题作一个总结. DataBinding数据绑定 DataTemplate自定义 <Hier ...
- [WPF系列]从基础起步学习系列计划
引言 WPF技术已经算不什么新技术,一搜一大把关于WPF基础甚至高级的内容.之前工作中一直使用winform所以一直没有深入学习WPF,这次因项目中使用了WPF技术来实现比较酷的展示界面.我在这里只是 ...
- Wpf解决TextBox文件拖入问题、拖放问题
在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同, 解放方法如下: 使用Previ ...
- WPF中TextBox文件拖放问题
在WPF中,当我们尝试向TextBox中拖放文件,从而获取其路径时,往往无法成功(拖放文字可以成功).造成这种原因关键是WPF的TextBox对拖放事件处理机制的不同,具体可参考这篇文章Textbox ...
- WPF 设置TextBox为空时,背景为文字提示
WPF 设置TextBox为空时,背景为文字提示. <TextBox FontSize="17" Height="26" Margin="2 ...
- WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法
WPF 在TextBox失去焦点时检测数据,出错重新获得焦点解决办法 在WPF的TextBox的LostFocus事件中直接使用Focus()方法会出现死循环的问题 正确的使用方式有2中方法: 方法一 ...
- WPF系列教程——(三)使用Win10 Edge浏览器内核 - 简书
原文:WPF系列教程--(三)使用Win10 Edge浏览器内核 - 简书 在需要显示一些 H5网站的时候自带的WebBrowser总是显示不了,WebBrowser使用的是IE内核,许多H5新特性都 ...
随机推荐
- .NET 扩展方法 (一)
我还记得刚刚学编程的时候,老师经常会提到一句话:注意空指针.所以经常在某些“入口”位置,进行代码校验,空指针的判断就是其中的一项工作. string类型作为常用的数据类型,它在项目中出现的机率极高,所 ...
- Java中从键盘中任意输入字符串,将其转换成数字后,并求和
- 容器--TreeMap
一.概述 在Map的实现中,除了我们最常见的KEY值无序的HashMap之外,还有KEY有序的Map,比较常用的有两类,一类是按KEY值的大小有序的Map,这方面的代表是TreeMap,另外一种就保持 ...
- Entity Framework Code First 中使用 Fluent API 笔记。
在做MVC+EF CodeFirst 的Demo时,碰到的问题, 在组册用户时,要让用户输入确认密码,但是数据库中又不需要保存这个字段,解决方案很多了,这里我列出通过EF Code First的解决方 ...
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块
config.xml文件的配置如下: <widget label="台风" icon="assets/images/typhoon.png" config ...
- Android Studio 运行出现 Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
转载请标明出处: http://www.cnblogs.com/why168888/p/5978381.html 本文出自:[Edwin博客园] 我引用compile 'com.squareup.re ...
- iOS推送(利用极光推送)
本文主要是基于极光推送的SDK封装的一个快速集成极光推送的类的封装(不喜勿喷) (1)首先说一下推送的一些原理: Push的原理: Push 的工作机制可以简单的概括为下图 图中,Provider是指 ...
- DIY一个高大上带提醒的计时器,简单实用,你还在等什么
小编心语:锵锵锵!小编我又来了!昨天发了一篇比较实用的<Python聊天室>,鉴于反响还不错,SO ,小编也想给大家多分享点有用的干货,让大家边学边用.好了,闲话不多说,今天要给各位看官们 ...
- jQuery与Zepto的异同
一,同: Zepto最初是为移动端开发的库,是jQuery的轻量级替代品,因为它的API和jQuery相似,而文件更小.Zepto最大的优势是它的文件大小,只有8k多,是目前功能完备的库中最小的一个, ...
- 高性能Linux服务器构建实战笔记
一. web应用篇 1 HTTP服务器Nginx 1.1 性能上.功能上.安装上与Apache对比 l 性能上占用系统资源少,支持并发高 ...