0

テキストボックス、ボタン、ラベル、トグルボタンがあるWPFアプリに取り組んでいます。私のアプリケーションでは、次の 2 つの操作を実行する必要があります。

  1. テキストボックスの入力を 0.0 から 5.0 の間のみに設定します。したがって、5.0 を超える値を書き込む場合は、5 に制限する必要があります。同様に、0.0 未満の値を書き込む場合は制限し、0.0 のみを表示する必要があります。

  2. 私のラベルは、値が 3.4 V の場合、ボルトを連結する必要があるため、コンテンツを「値」VIe として表示する必要があります。

Xaml は次のとおりです。

<TextBox Grid.Column="1" Text="{Binding VoltageText}" Name="VoltageBox" />        
<Label Grid.Column="2" Content="{Binding CurrentText}" Name="CurrentLabel" />

モデル クラス:

string voltageText = string.Empty;
    public string VoltageText
    {
        get
        {
            return voltageText;
        }

        set
        {
            voltageText = value;
            OnPropertyChanged("VoltageText");
        }
    }

最初のポイントで述べたように、このテキストボックスには入力制限が必要です:) 0-9 と . テキストボックス内:

// present in xaml.cs
private void VoltageBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        string txt = VoltageBox.Text;
        if (txt != "")
        {
            VoltageBox.Text = Regex.Replace(VoltageBox.Text, "[^0-9] [^.]", "");
            if (txt != VoltageBox.Text)
            {
                VoltageBox.Select(VoltageBox.Text.Length, 0);
            }
        }
    }

    string currentText = "0 V";
    public string CurrentText
    {
        get
        {
            return currentText;
        }

        set
        {
            currentText = value;
            OnPropertyChanged("CurrentText");
        }
    }     

起動時に気付くことができCurrenttext = 0 V、これらのステートメントを実行することで、の値を変更したいCurrentText:

double tempval = 120.0;

string CurrentVal = Convert.ToString(tempval / 10);
CurrentText = CurrentVal; // here V as volts must be concatenated and value must be 12.0 V
4

1 に答える 1

3

これが物事を行う方法の大まかな方法​​です。

最初に ViewModel で、電圧の実効値である 1 つのプロパティと、それに「V」を追加する計算されたプロパティを用意します。この種のことを行うのは、View の責任ではなく、ViewModel の責任です。

    private double voltage = 0.0D;
    public double Voltage
    {
        get
        {
            return voltage;
        }

        set
        {
            if (value > 5.0D || value < 0.0D)
                throw new InvalidOperationException();
            voltage = value;
            OnPropertyChanged("Voltage");
        }
    }

    public string VoltageText
    {
        get
        {
            return Voltage + " V";
        }
    }

次に、コントロールについては、TextChanged を使用しないでください。PreviewTextInput を使用することをお勧めします。

あなたの waml で:

    <TextBox Grid.Column="1" Text="{Binding Voltage}" Name="VoltageBox" PreviewTextInput="TextBox_PreviewTextInput" />
    <Label Grid.Column="2" Content="{Binding VoltageText}" Name="CurrentLabel" />

コードビハインドで

    private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
    {
        var textBox = sender as TextBox;
        if (textBox == null)
            throw new ArgumentException("sender");

        double result;
        var insertedText = e.Text;
        if (!double.TryParse(insertedText, out result) && insertedText != ".")
        {
            e.Handled = true;
        }
        else
        {
            string textboxCurrentValue = textBox.Text;
            int selectionLength = textBox.SelectionLength;
            int selectionStart = textBox.SelectionStart;
            if (selectionLength != 0)
            {
                textboxCurrentValue = textboxCurrentValue.Remove(selectionStart, selectionLength);
            }
            textboxCurrentValue = textboxCurrentValue.Insert(selectionStart, insertedText);

            if (!double.TryParse(textboxCurrentValue, out result) || result > 5.0D || result < 0.0D)
            {
                e.Handled = true;
            }
        }
    }

これで始められるはずです!

于 2012-10-16T12:59:02.730 に答える