2015-09-14 13 views
6

Sto cercando di ottenere l'input dell'utente dalla casella di testo in un'applicazione WPF che sto costruendo. L'utente inserirà un valore numerico e vorrei memorizzarlo in una variabile. Sto solo iniziando con C#. Quindi qualche idea su come farlo?Ottenere l'input dell'utente dalla casella di testo nell'applicazione WPF

Attualmente sto aprendo la casella di testo e lasciando che l'utente inserisca il valore. Successivamente, l'utente deve premere un pulsante su cui il testo da textbbox è memorizzato in una variabile.

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

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

So che non è giusto. Qualcuno ha qualche idea?

+0

Stai cercando di convertire l'input per un numero? –

+1

@crossemup Se si desidera memorizzare il valore da memorizzare in una variabile dopo aver fatto clic sul pulsante. Lo stai facendo correttamente ... Perché pensi che questo non sia corretto? –

+0

No non sto cercando di convertire l'input in un numero. L'input stesso è un numero. Sto cercando di memorizzare quel numero in una variabile – crossemup

risposta

13

Come @ Michael McMullin già detto, è necessario definire la variabile fuori della vostra funzione come questa:

string str; 

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

// somewhere ... 
DoSomething(str); 

Il punto è: la visibilità delle variabili dipende dal suo ambito di applicazione. Si prega di dare un'occhiata a this explanation.

+1

... perché all'interno del gestore eventi la variabile locale esce ... [almeno finisci la risposta in modo che l'OP sappia perché l'approccio attuale non funziona] ... – slugster

+0

'var h;' non funzionerà. ['var' (C# Reference)] (https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/var) può essere utilizzato solo nell'ambito del metodo. –

+0

@Olivier Jacot-Descombes Hai ragione, ho modificato. – duDE

0
// 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); 
} 
4

Bene, ecco un semplice esempio di come farlo con MVVM.

In primo luogo scrivere una vista modello:

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

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

    public event PropertyChangedEventHandler PropertyChanged; 
} 

poi scrivere un convertitore, in modo da poter tradurre la stringa in int e viceversa

[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"); 

    } 
} 

quindi scrivere il codice XAML in questo modo:

<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> 

+0

Sto provando a fare qualcosa di semplice: quando premi il pulsante, mostra una finestra di messaggio che ti dice il testo all'interno della casella di testo. Devo fare tutto questo semplicemente per ottenere il testo all'interno della casella di testo? Non posso accedere direttamente alla casella di testo e chiamare getText() o qualcosa del genere? – alxcyl

+0

Wow questo è un sacco di codice per qualcosa di così banale. E la gente si chiede perché odio MVVM/MVC ....Ottima presentazione, però. – vapcguy

2

si può anche solo dare un nome al vostro controllo

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

e nel codice

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