Вам не нужны никакие другие причудливые ответы. Ниже приведен упрощенный пример , который не имеет все Margin
, Height
,Width
свойства , установленные в XAML, но должно быть достаточно , чтобы показать , как получить это сделано на базовом уровне.
XAML
Создайте Window
страницу, как обычно, и добавьте к ней свои поля, скажем, Label
и TextBox
элемент управления внутри StackPanel
:
<StackPanel Orientation="Horizontal">
<Label Name="lblUser" Content="User Name:" />
<TextBox Name="txtUser" />
</StackPanel>
Затем создайте стандарт Button
для отправки («ОК» или «Отправить») и кнопку «Отменить», если хотите:
<StackPanel Orientation="Horizontal">
<Button Name="btnSubmit" Click="btnSubmit_Click" Content="Submit" />
<Button Name="btnCancel" Click="btnCancel_Click" Content="Cancel" />
</StackPanel>
Code-Behind
Вы добавите Click
функции обработчика событий в код программной части, но когда вы перейдете туда, сначала объявите общедоступную переменную, в которой вы будете хранить значение вашего текстового поля:
public static string strUserName = String.Empty;
Затем для функций обработчика событий (щелкните правой кнопкой мыши Click
функцию на кнопке XAML, выберите «Перейти к определению», он создаст его для вас) вам потребуется проверить, пуст ли ваше поле. Вы сохраняете его в своей переменной, если это не так, и закрываете окно:
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.");
}
Вызов его с другой страницы
Вы думаете, что если я закрою окно с этим this.Close()
там, моя ценность исчезнет, верно? НЕТ !! Я узнал об этом с другого сайта: http://www.dreamincode.net/forums/topic/359208-wpf-how-to-make-simple-popup-window-for-input/
У них был аналогичный пример (я его немного очистил) того, как открыть ваш Window
от другого и получить значения:
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
}
}
Кнопка отмены.
Вы думаете, а что насчет кнопки отмены? Поэтому мы просто добавляем еще одну общедоступную переменную обратно в наш код всплывающего окна:
public static bool cancelled = false;
И давайте включим наш btnCancel_Click
обработчик событий и внесем одно изменение в 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.");
}
А затем мы просто читаем эту переменную в нашем MainWindow
btnOpenPopup_Click
событии:
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
}
}
Длинный ответ, но я хотел показать, насколько просто использовать public static
переменные. Нет DialogResult
, никаких возвращаемых значений, ничего. Просто откройте окно, сохраните свои значения с помощью событий кнопок во всплывающем окне, а затем извлеките их в функции главного окна.