Ho 2 caselle di testo nel controllo utente WPF e pulsante nel modulo WPF. Come posso accedere coloro valore testo sul evento click del pulsante di quella forma principale dove sto utilizzando il controllo utente WPFAccesso al valore di controllo utente WPF
risposta
Prima di tutto, tenere a mente che WPF non è WinForms - in teoria si dovrebbe dati lega i tuoi TextBox alle proprietà e modifica il valore delle proprietà, invece di accedere direttamente ai TextBox!
Detto questo, tutto ciò che dovete fare è dare un nome al UserControl e le caselle di testo, e quindi accedervi, in questo modo:
Int MyUserControl.xaml:
<TextBox x:Name="myTextBox1"/>
<TextBox x:Name="myTextBox2"/>
In MyWindow.xaml:
<local:MyUserControl x:Name="myUserControlInstance"/>
<Button Content="Click me" Click="Button_Click" />
In MyWindo w.xaml.cs:
private void Button_Click(object sender, RoutedEventArgs e) {
myUserControlInstance.myTextBox1.Text = "Foo";
myUserControlInstance.myTextBox2.Text = "Bar";
}
Nel usercontrol, rendono due proprietà pubbliche che restituiscono una stringa:
public property Textbox1Text
{
get { return TextBox1.Text; }
}
quindi il testo dai controlli casella di testo è visibile al modulo principale.
O una soluzione migliore: avere un evento che l'usercontrol può sollevare, chiamarlo come TextChanged
. Naturalmente si desidera un nome migliore per esso che quello, così facciamo solo finta che il primo testo è stato progettato per l'utente di inserire un nome e chiamare l'evento NameTextChanged
, allora il vostro evento sarà qualcosa di simile:
public MainWindow()
{
InitializeComponent();
TextBox1.TextChanged += new TextChangedEventHandler(TextBox1_TextChanged);
}
private void TextBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (NameTextChanged!= null)
this.NameTextChanged(this, e);
}
public event TextChangedEventHandler NameTextChanged;
o, meglio ancora, potresti andare per un evento indirizzato, ma prima rimani con le nozioni di base.
La sottoscrizione a un evento sembra essere un'opzione migliore, come suggerito da slugster sopra. Se si utilizza questo approccio, è possibile avere più istanze dello stesso controllo utente nella stessa finestra, ma gestirle in modo diverso in base al controllo utente da cui provengono.
Ad esempio è possibile avere il controllo utente del tipo di indirizzo che può avere l'indirizzo del mittente e l'indirizzo del destinatario che potrebbero avere gli stessi campi come via, città, stato ecc. Ma può comportarsi in modo diverso quando l'indirizzo del mittente o l'indirizzo del destinatario viene aggiornato.
Spero che questo aiuti.
Nilesh Gule
http://nileshgule.blogspot.com
Per il vostro problema specifico, che può suggerire una soluzione specifica. Questo non può essere trattato come generale.
Il tuo problema è leggere il contenuto delle caselle di testo nel controllo utente con un clic.
Ecco la soluzione.
In questa soluzione, ci saranno due file xaml e rispettivi file .cs.
Logica: - La logica intrinseca è quella di scorrere gli ekements visivi nel controllo utente, trovare le caselle di testo, leggere il testo al suo interno sul pulsante clic.
ecco il codice ...
Window.xaml - questa è la nostra finestra principale. Questo contiene 1 pulsante e il riferimento all'oggetto del controllo utente.
<Grid> <StackPanel Orientation="Vertical"> <Button x:Name="clickThis" Height="30" Width="70" Content="Click Me!!" Click="clickThis_Click" /> <local:TxtBoxedUC x:Name="UC" /> </StackPanel> </Grid>
TxtBoxedUC.xaml - Questo è il nostro controllo utente. Questo contiene le nostre due caselle di testo.
<Grid> <StackPanel Orientation="Vertical"> <TextBox x:Name="txt1" Width="150" Height="30" /> <TextBox x:Name="txt2" Width="150" Height="30" /> </StackPanel> </Grid>
Window1.xaml.cs - Questo contiene il metodo click tasto, così come il metodo per scorrere gli elementi visivi del controllo utente.
private void clickThis_Click(object sender, RoutedEventArgs e) { GetVisual(UC); }
Il codice di cui sopra è quello di gestire il clic del pulsante.
private void GetVisual(UIElement currentVisual)
{
int count = VisualTreeHelper.GetChildrenCount(currentVisual);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
UIElement uiElement = VisualTreeHelper.GetChild(currentVisual, i) as UIElement;
if (uiElement != null)
{
if (uiElement.GetType() == typeof(TextBox))
{
TextBox txt = uiElement as TextBox;
MessageBox.Show(txt.Text);
}
}
GetVisual(uiElement);
}
}
}
Sopra il codice è per scorrere gli elementi visivi nel controllo utente.
Il file .cs del controllo utente non è necessario.
Ora, quando si fa clic sul pulsante, è possibile vedere che è stato inserito nel MessageBox.
codifica Felice ...
Si prega di contrassegnare come risposta se questo risolve il problema.
Prova questo:
private void Button_Click(object sender, RoutedEventArgs e)
{
string myTextboxValue = this.tbInput.Text;
}