Nie potrzebujesz ŻADNEJ z tych innych wymyślnych odpowiedzi. Poniżej znajduje się uproszczony przykład, który nie ma wszystkich Margin
, Height
, Width
wł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 Window
stronę tak jak zwykle i dodaj do niej swoje pola, powiedz a Label
i TextBox
kontroluj wewnątrz a StackPanel
:
<StackPanel Orientation="Horizontal">
<Label Name="lblUser" Content="User Name:" />
<TextBox Name="txtUser" />
</StackPanel>
Następnie utwórz standard Button
przesył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ć Click
funkcje 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 Click
funkcję 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 Window
z 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_Click
program 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_Click
zdarzeniu:
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 static
zmiennych. 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.