【问题标题】:Get user input from a textbox in a WPF application从 WPF 应用程序中的文本框获取用户输入
【发布时间】:2015-09-14 10:59:29
【问题描述】:

我正在尝试从我正在构建的 WPF 应用程序中的文本框中获取用户输入。用户将输入一个数值,我想将其存储在一个变量中。我刚刚开始使用 C#。我该怎么做?

目前我正在打开文本框并让用户输入值。之后,用户必须按下一个按钮,在该按钮上来自文本框的文本存储在一个变量中。

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    var h = text1.Text;
}

我知道这是不对的。什么是正确的方法?

【问题讨论】:

  • 您是否尝试将输入转换为数字?
  • @crossemup 如果要在按钮单击后将要存储的值存储在变量中。你做得对……为什么你觉得这不正确?
  • 不,我不想将输入转换为数字。输入本身是一个数字。我希望将该数字存储到变量中
  • 其实就是一个字符串。我在问您是否需要将其转换为数字,因为您的代码已经正确存储了它。如果您需要在 Button_Click 事件处理程序之外访问它,那么您只需在该范围之外定义您的变量。
  • 如果你想在按钮点击事件上存储文本框的值,那么你就是正确的。您也可以使用 Bindings,但由于您是 c# 的新手,所以它对您来说会很复杂。

标签: c# wpf textbox user-input


【解决方案1】:

就像@Michael McMullin 已经说过的那样,您需要像这样在函数之外定义变量:

string str;

private void Button_Click(object sender, RoutedEventArgs e)
{
    str = text1.Text;
}

// somewhere ...
DoSomething(str);

重点是:变量的可见性取决于它的作用域。请看this explanation

【讨论】:

  • ...因为在事件处理程序内部,局部变量退出... [至少完成答案,以便 OP 知道为什么当前方法不起作用]...
  • var h; 将不起作用。 var (C# Reference) 只能在方法范围内使用。
  • @Olivier Jacot-Descombes 你说得对,我已经编辑过了。
  • str = text1.Text;我在哪里可以访问 text1 ?
  • @agDev 这是 XAML 中 TextBox 的名称
【解决方案2】:

好吧,这里有一个简单的例子来说明如何使用 MVVM 来做到这一点。

首先编写一个视图模型:

public class SimpleViewModel : INotifyPropertyChanged
{
    private int myValue = 0;

    public int MyValue
    {
        get
        {
            return this.myValue;
        }
        set
        {
            this.myValue = value;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

然后写一个转换器,这样你就可以把你的字符串翻译成int,反之亦然:

[ValueConversion( typeof(int), typeof(string))]
class SimpleConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value.ToString();
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int returnedValue;

        if (int.TryParse((string)value, out returnedValue))
        {
            return returnedValue;
        }

        throw new Exception("The text is not a number");
    }
}

然后像这样编写你的 XAML 代码:

<Window x:Class="StackoverflowHelpWPF5.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:[YOURNAMESPACEHERE]"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <local:SimpleViewModel></local:SimpleViewModel>
    </Window.DataContext>
    <Window.Resources>
        <local:SimpleConverter x:Key="myConverter"></local:SimpleConverter>
    </Window.Resources>
    <Grid>
        <TextBox Text="{Binding MyValue, Converter={StaticResource myConverter}, UpdateSourceTrigger=PropertyChanged}"></TextBox>
    </Grid>
</Window>

【讨论】:

  • 我试图做一些简单的事情:当你按下按钮时,它会显示一个消息框,告诉你文本框中的文本。我需要做所有这些只是为了简单地获取文本框中的文本吗?我不能直接访问文本框并调用 getText() 之类的吗?
  • 哇,对于如此平凡的事情来说,这是很多代码。人们想知道为什么我讨厌 MVVM/MVC.... 很棒的演示文稿。
【解决方案3】:

你也可以给你的控件起个名字:

<TextBox Height="251" ... Name="Content" />

在代码中:

private void Button_Click(object sender, RoutedEventArgs e)
{
    string content = Content.Text;
}

【讨论】:

    【解决方案4】:
    // WPF
    
    // Data
    int number;
    
    // Button click event
    private void Button_Click(object sender, RoutedEventArgs e) {
        // Try to parse number
        bool isNumber = int.TryParse(text1.Text, out number);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-12
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 2014-12-06
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-12
      相关资源
      最近更新 更多