1

这是我的 Windows 应用程序将摄氏度转换为华氏度的一种布局。问题是,当我尝试输入温度时,它会显示一些垃圾(例如:如果我输入“3”,它会显示在“3.0000009”中),有时甚至会显示堆栈溢出异常。输出也没有正确显示:

cel.text是摄氏度的文本框。 fahre.text是华氏温度的文本框。

namespace PanoramaApp1
{
    public partial class FahretoCel : PhoneApplicationPage
    {
    public FahretoCel()
    {
        InitializeComponent();

    }

    private void fahre_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (fahre.Text != "")
        {
            try
            {
                double F = Convert.ToDouble(fahre.Text);
                cel.Text = "" + ((5.0/9.0) * (F - 32)) ; //this is conversion expression

            }

            catch (FormatException)
            {
                fahre.Text = "";
                cel.Text = "";
            }

        }
        else
        {
            cel.Text = "";
        }
    }

    private void cel_TextChanged(object sender, TextChangedEventArgs e)
    {

        if (cel.Text != "")
        {
            try
            {
                Double c = Convert.ToDouble(cel.Text);
                fahre.Text = "" + ((c *(9.0 / 5.0 )) + 32);

            }
            catch (FormatException)
            {
                fahre.Text = "";
                cel.Text = "";
            }

        }
        else
        {
            fahre.Text = "";
        }
    }

}
}
4

2 回答 2

2

正在发生的事情是,您的Text_Changed事件处理程序正在相互触发,并且它们不断更改彼此的文本。

当您从摄氏度转换为华氏度时,它会无限地来回转换。

这解释了您的堆栈溢出错误和您输入的文本更改。

我会做什么,我会用按钮执行转换吗,或者,你可以有一个布尔变量来打开或关闭其他事件处理程序。

想象这样的事情

protected bool textChangedEnabled = true;

private void cel_TextChanged(object sender, TextChangedEventArgs e)
{
    if(textChangedEnabled)
    {
        textChangedEnabled = false;
        if (cel.Text != "")
        {
            try
            {
                Double c = Convert.ToDouble(cel.Text);
                fahre.Text = "" + ((c *(9.0 / 5.0 )) + 32);

            }
            catch (FormatException)
            {
                fahre.Text = "";
                cel.Text = "";
            }

        }
        else
        {
            fahre.Text = "";
        }
        textChangedEnabled = true;
    }
}

可能有一种更优雅、更线程安全的方法来完成它,但这只是一个简单的修复。

于 2012-11-14T16:58:39.120 回答
1

您可以使用 Math.Round 将值四舍五入到小数点后所需的位数。四舍五入到零将删除小数部分。

改变

cel.Text = "" + ((5.0/9.0) * (F - 32)) ;

cel.Text = Math.Round( ((5.0/9.0) * (F - 32)), 2).ToString() ;
于 2012-11-14T16:55:54.727 回答