0

我想制作双向的 am/s 到 km/h 转换器,就像谷歌所做的那样。我在 WPF 中使用了 TextChanged,它还挺有效的。我的问题是,当我输入例如 7 时,程序会在同一字段中写入 6,9999999...。我怀疑这是因为 2 个字段来回转换并找到最精确的数字。

我希望它每个字段只转换一次。因此,如果我在 km/h 字段中键入 7,它应该只转换为 m/s 然后停止。

我输入 7,但得到 6,9999999 的示例

我用于该程序的 2 种方法:

private void ms_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (ms.Text == "")
        {
            kmh.Text = "";
        }
        else
        {
            try
            {
                kmh.Text = (double.Parse(ms.Text) * 3.6).ToString();
                kmh.CaretIndex = kmh.Text.Length;
            }
            catch (Exception)
            {
                MessageBox.Show("Input must be a valid number");
            }
            
        }
    }

    private void kmt_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (kmh.Text == "")
        {
            ms.Text = "";
        }
        else
        {
            try
            {
                ms.Text = (double.Parse(kmh.Text) / 3.6).ToString();
                ms.CaretIndex = ms.Text.Length;
            }
            catch (Exception)
            {
                MessageBox.Show("Input must be a valid number");
            }
            
        }
    }
4

1 回答 1

0

谢谢你的所有答案。@Sinatr 的这个链接对我帮助很大!

我最终得到了这段代码。我在转换之前解耦了 Textchanged 事件,进行了转换,然后重新附加了它。

private void ms_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (ms.Text == "")
        {
            kmh.Text = "";
        }
        else
        {
            try
            {
                kmh.TextChanged -= kmh_TextChanged;
                kmh.Text = (double.Parse(ms.Text) * 3.6).ToString();
                kmh.TextChanged += kmh_TextChanged;
            }
            catch (Exception)
            {
                MessageBox.Show("Input must be a valid number");
            }
            
        }
    }

    private void kmt_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (kmh.Text == "")
        {
            ms.Text = "";
        }
        else
        {
            try
            {
                ms.TextChanged -= ms_TextChanged;
                ms.Text = (double.Parse(kmh.Text) / 3.6).ToString();
                ms.TextChanged += ms_TextChanged;
            }
            catch (Exception)
            {
                MessageBox.Show("Input must be a valid number");
            }
            
        }
    }
于 2020-11-13T09:41:13.097 回答