No necesita NINGUNA de estas otras respuestas sofisticadas. A continuación se muestra un ejemplo simplista que no tiene todo el Margin
, Height
, Width
propiedades establecidas en el XAML, pero debe ser suficiente para mostrar cómo hacer esto a un nivel básico.
XAML
Construir una Window
página como lo haría normalmente y añadir sus campos para que, digamos una Label
y TextBox
de control dentro de una StackPanel
:
<StackPanel Orientation="Horizontal">
<Label Name="lblUser" Content="User Name:" />
<TextBox Name="txtUser" />
</StackPanel>
Luego cree un estándar Button
para 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 Click
funciones 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 Click
con 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 static
variables. 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.