Nie potrzebujesz ŻADNEJ z tych innych wymyślnych odpowiedzi. Poniżej znajduje się uproszczony przykład, który nie ma wszystkich Margin, Height, Widthwłaściwości określone w XAML, ale powinien być wystarczający, aby pokazać, w jaki sposób, aby to zrobić na poziomie podstawowym.
XAML
Zbuduj Windowstronę tak jak zwykle i dodaj do niej swoje pola, powiedz a Labeli TextBoxkontroluj wewnątrz a StackPanel:
<StackPanel Orientation="Horizontal">
<Label Name="lblUser" Content="User Name:" />
<TextBox Name="txtUser" />
</StackPanel>
Następnie utwórz standard Buttonprzesyłania („OK” lub „Prześlij”) i przycisk „Anuluj”, jeśli chcesz:
<StackPanel Orientation="Horizontal">
<Button Name="btnSubmit" Click="btnSubmit_Click" Content="Submit" />
<Button Name="btnCancel" Click="btnCancel_Click" Content="Cancel" />
</StackPanel>
Code-Behind
Będziesz dodać Clickfunkcje obsługi zdarzeń w kodzie opóźnieniem, ale kiedy tam najpierw zadeklarować zmienną publiczną, gdzie można przechowywać swoją wartość pola tekstowego:
public static string strUserName = String.Empty;
Następnie dla funkcji obsługi zdarzeń (kliknij prawym przyciskiem myszy Clickfunkcję na przycisku XAML, wybierz „Przejdź do definicji”, utworzy ją za Ciebie), musisz sprawdzić, czy twoje pole jest puste. Przechowujesz go w swojej zmiennej, jeśli tak nie jest, i zamknij okno:
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(txtUser.Text))
{
strUserName = txtUser.Text;
this.Close();
}
else
MessageBox.Show("Must provide a user name in the textbox.");
}
Wywołanie tego z innej strony
Myślisz, że jeśli zamknę okno z tym this.Close(), moja wartość zniknie, prawda? NIE!! Dowiedziałem się tego z innej strony: http://www.dreamincode.net/forums/topic/359208-wpf-how-to-make-simple-popup-window-for-input/
Mieli podobny przykład do tego (trochę go wyczyściłem), jak otworzyć twój Windowz innego i pobrać wartości:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void btnOpenPopup_Click(object sender, RoutedEventArgs e)
{
MyPopupWindow popup = new MyPopupWindow(); // this is the class of your other page
//ShowDialog means you can't focus the parent window, only the popup
popup.ShowDialog(); //execution will block here in this method until the popup closes
string result = popup.strUserName;
UserNameTextBlock.Text = result; // should show what was input on the other page
}
}
Przycisk Anuluj Zastanawiasz
się, a co z tym przyciskiem Anuluj? Więc po prostu dodajemy kolejną zmienną publiczną z powrotem w naszym kodzie wyskakującego okna:
public static bool cancelled = false;
Dołączmy nasz btnCancel_Clickprogram obsługi zdarzeń i wprowadźmy jedną zmianę w btnSubmit_Click:
private void btnCancel_Click(object sender, RoutedEventArgs e)
{
cancelled = true;
strUserName = String.Empty;
this.Close();
}
private void btnSubmit_Click(object sender, RoutedEventArgs e)
{
if (!String.IsNullOrEmpty(txtUser.Text))
{
strUserName = txtUser.Text;
cancelled = false; // <-- I add this in here, just in case
this.Close();
}
else
MessageBox.Show("Must provide a user name in the textbox.");
}
A potem właśnie odczytaliśmy tę zmienną w naszym MainWindow btnOpenPopup_Clickzdarzeniu:
private void btnOpenPopup_Click(object sender, RoutedEventArgs e)
{
MyPopupWindow popup = new MyPopupWindow(); // this is the class of your other page
//ShowDialog means you can't focus the parent window, only the popup
popup.ShowDialog(); //execution will block here in this method until the popup closes
// **Here we find out if we cancelled or not**
if (popup.cancelled == true)
return;
else
{
string result = popup.strUserName;
UserNameTextBlock.Text = result; // should show what was input on the other page
}
}
Długa odpowiedź, ale chciałem pokazać, jakie to łatwe przy użyciu public staticzmiennych. Nie DialogResult, żadnych wartości zwracanych, nic. Po prostu otwórz okno, zapisz wartości za pomocą przycisków zdarzeń w wyskakującym oknie, a następnie pobierz je w funkcji okna głównego.