如何使用 WPF 中的 TextChanged 从 km/h 转换为 m/s,没有很多小数

How to convert from km/h to m/s with TextChanged in WPF, without a lot of decimals

我想制作一个 m/s 到 km/h 的转换器,它可以双向工作,就像 google 一样。我在 WPF 中使用了 TextChanged,它有点管用。我的问题是,当我输入例如 7 时,程序会在同一字段中写入 6,9999999...。我怀疑是因为2个字段来回转换并找到最精确的数字。

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

Example of me typing in 7, but getting 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");
            }
            
        }
    }

谢谢大家的回答。 @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");
            }
            
        }
    }