WPF TextBox与字符串格式0:N2反应怪异

问题描述 投票:0回答:1

这很难解释,所以请看下面的WPF gif----。

我有一个字符串格式为{0:N2}的文本框,并绑定到一个属性。

enter image description here

这里有两个问题

(1)当按下小数键时,又增加了一位小数。

(2)在退格键中,删除小数点后,小数点没有跳过小数点,而是开始给数字本身添加'00'。

我为第(1)点做了一个变通方法----------。

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Decimal)
    {
        e.Handled = true;
        ((TextBox)sender).CaretIndex += 1;
    }
}

如果有更好的方法来处理这些事情,请告诉我。

现在,我如何处理第二个问题?我试图实现的变通方法是--如果到达小数点,处理按键并移动小数点的位置。不知道这是否是一个好的解决方案,如果是的话,如何知道我什么时候到达小数点?

将小数点指数与文本框值的长度进行比较,就为了知道是否到了小数点,似乎有些过分。这2个问题的正确解决方法是什么?

c# wpf textbox string-formatting
1个回答
1
投票

问题是由于当stringformat被应用到值时。

也就是当值从绑定的Source(绑定的字符串属性)返回到TextBox Text(目标)的时候。

而且它与textpropety的元数据相连。

Textbox TextProperty绑定的是双路,这是在该依赖属性的元数据中设置的。

文本框的默认行为是当控件失去焦点时将值复制到绑定的源。

如果你使用这种方式,那么一旦用户完成编辑,就会应用n2格式。他们可以随心所欲地修改零点和小数点,只有当他们离开标签时,格式才会被应用。

相反,如果你在绑定中设置UpdateSourceTrigger="PropertyChanged",那么你会发现它的行为很奇怪。这是因为用户键入一个字母后,整个值会被转移到绑定的属性中,而属性会通知控件它发生了变化.在应用格式化时,各种奇怪的坏事都会发生。

这有可能是构建文本框的人没有考虑到的边缘情况。

© www.soinside.com 2019 - 2024. All rights reserved.