文章目录
- 属性绑定
- 文本回车事件
- 限定文本内容
txt阅读器系列:
- 需求分析和文件读写
- 目录提取类💎列表控件与目录💎快捷键翻页
- 字体控件绑定💎前景/背景颜色
- 书籍管理系统💎用树形图管理书籍
- 语音播放💎播放进度显示💎快进快退💎语速音量
- 文本清理的布局💎段落合并💎编码检测
属性绑定
除了语速音量之外,阅读设置
中的字体大小用到的也是这种TextBox, Slider, Button
的组合形式,故而也可将这个新控件应用到字体尺寸
的设置上。
但由于字体尺寸会直接绑定txt
的FontSize
属性,而刚刚创建的AdvanceSlider
尽管可以注册事件,但还不能支持Binding
用法。为此,可修改有关Value
的设置
[Bindable(true)]
public double Value { set; get; }
public static readonly DependencyProperty ValueProperty =DependencyProperty.Register("Value", typeof(double), typeof(Control),new PropertyMetadata(0.0));
其中,[Bindable(true)]
表示Value
参数支持Binding
语法,然后通过DependencyProperty
来注册Value参数,从而赋予其实际的绑定功能。
DependencyProperty.Register
共有4个输入参数,其中"Value"为准备注册的属性名字,然后接下来的两个类型,分别是该属性的类型,以及该属性所有者的类型。最后new PropertyMetadata(0.0)
,通过一个浮点型的0.0
创建了一个元数据。
然后,AdvanceSlider
就可以完全应用在字体尺寸中了。
文本回车事件
AdvanceSlider
目前还有一个问题,即TextBox
仍然是允许输入数值的,但其输入将不起任何作用,这一点显得很呆。为此,可以为TextBox
注册一个回车事件
<TextBox Width="50" Height="20" Text="{Binding Value, ElementName=slider}" KeyDown="txt_KeyDown"/>
C#
代码为
private void txt_KeyDown(object sender, KeyEventArgs e)
{if (e.Key != Key.Enter)return;TextBox tb = sender as TextBox;double v;if(!double.TryParse(tb.Text, out v)){tb.Text = Value.ToString();return;}if (v > Max)v = Max;else if(v< Min)v = Min;slider.Value = v;
}
其逻辑是,当文本框中输入的内容可以转换为double
类型时,将其转换后的值赋给slider.Value
。但是,如果这个值超出了slider.Value
的范围,那么就就近设为边界。
限定文本内容
另一个问题是,文本中输入了不合法的参数,比如输入一二三
,是没办法转换成浮点数的。为此,可以直接拒绝在文本框中输入非数字的字符:首先更改文本控件
<TextBox Width="50" Height="20" Text="{Binding Value, ElementName=slider}" KeyDown="txt_KeyDown"InputMethod.IsInputMethodEnabled =" False"PreviewTextInput ="limitNumber"/>
其中,InputMethod.IsInputMethodEnabled
属性用于禁用系统输入法,limitNumber
则用于限定文本框中的内容,具体实现为
public void limitNumber(object sender, TextCompositionEventArgs e)
{Regex re = new Regex(@"[^0-9\-]");e.Handled = re.IsMatch(e.Text);
}
其中new Regex
是一个正则表达式,表示仅限于输入数字0-9
和负号-
。