No necesita NINGUNA de estas otras respuestas sofisticadas. A continuación se muestra un ejemplo simplista que no tiene todo el Margin, Height, Widthpropiedades establecidas en el XAML, pero debe ser suficiente para mostrar cómo hacer esto a un nivel básico.
XAML
Construir una Windowpágina como lo haría normalmente y añadir sus campos para que, digamos una Labely TextBoxde control dentro de una StackPanel:
<StackPanel Orientation="Horizontal">
<Label Name="lblUser" Content="User Name:" />
<TextBox Name="txtUser" />
</StackPanel>
Luego cree un estándar Buttonpara Envío ("Aceptar" o "Enviar") y un botón "Cancelar" si lo desea:
<StackPanel Orientation="Horizontal">
<Button Name="btnSubmit" Click="btnSubmit_Click" Content="Submit" />
<Button Name="btnCancel" Click="btnCancel_Click" Content="Cancel" />
</StackPanel>
Código subyacente
Agregará las Clickfunciones del controlador de eventos en el código subyacente, pero cuando vaya allí, primero declare una variable pública donde almacenará el valor del cuadro de texto:
public static string strUserName = String.Empty;
Luego, para las funciones del controlador de eventos (haga clic Clickcon el botón derecho en la función en el botón XAML, seleccione "Ir a la definición", la creará para usted), necesita una verificación para ver si su casilla está vacía. Lo almacena en su variable si no es así, y cierra su ventana:
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.");
}
Llamarlo desde otra página
Estás pensando, si cierro mi ventana con esothis.Close() ahí arriba, mi valor se ha ido, ¿verdad? ¡¡NO!! Encontré esto en otro sitio: http://www.dreamincode.net/forums/topic/359208-wpf-how-to-make-simple-popup-window-for-input/
Tenían un ejemplo similar a este (lo limpié un poco) de cómo abrir su Window de otro y recuperar los valores:
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
}
}
Botón Cancelar
Estás pensando, bueno, ¿qué pasa con el botón Cancelar? Así que simplemente agregamos otra variable pública en nuestro código subyacente de la ventana emergente:
public static bool cancelled = false;
E incluyamos nuestro btnCancel_Click controlador de eventos y hagamos un cambio en 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.");
}
Y luego leemos esa variable en nuestro MainWindow btnOpenPopup_Click evento:
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
}
}
Respuesta larga, pero quería mostrar lo fácil que es usar public staticvariables. No DialogResult, sin valores devueltos, nada. Simplemente abra la ventana, almacene sus valores con los eventos de botón en la ventana emergente, luego recupérelos en la función de la ventana principal.