Вы находитесь на странице: 1из 20

Cuadro de dilogo

Ejemplo de cuadro de dilogo.


Un cuadro de dilogo es un tipo de ventana que permite comunicacin simple entre el usuario y el
sistema informtico.
El tipo cuadro de dilogo ms simple nicamente informa al usuario, es decir que muestran un texto (y
eventualmente objetos grficos) y ofrece la opcin de cerrar el cuadro. Un ejemplo es un cuadro de error.
Luego existen cuadros de pregunta o confirmacin, que adems de mostrar informacin ofrecen
alternativas al usuario. La ms sencilla es una opcin binaria como aceptar / cancelar o permitir / impedir.
Existen versiones ms complejas con ms opciones. Por ejemplo, si el usuario intenta cerrar un editor de
texto y el documento abierto tiene cambios sin guardar, un cuadro de dilogo completo podra mostrar
cuatro opciones: cerrar sin guardar, guardar y salir, cancelar el cierre y seguir editando y guardar
con otro nombre, sta ltima con una caja de texto donde ingresar el nombre alternativo.
Los cuadro de dilogo se los clasifica en modales y no modales, segn si impiden o permiten que el
usuario contine usando el programa ignorando el cuadro. Los cuadros modales se suelen usar para
mostrar informacin crtica y ante eventos peligrosos y acciones irreversibles.
En ocasiones, se usan cuadro de dilogo para paliar la ausencia de funcionalidad de revertir acciones. Los
expertos en usabilidad afirman que es un mecanismo pobre, ya que desconcierta al usuario ante el cambio
brusco en el funcionamiento del programa, y motiva a ignorar la informacin del cuadro.
Informacin general sobre cuadros de dilogo

.NET Framework 4.5

Otras versiones

cuadros de dilogo y hay dos tipos: modales y no modales.


modales los muestras las funciones cuando necesitan datos adicionales de los usuarios para

continuar. Aceptar o Cancelar. Aceptar se indica que el usuario ha introducido los datos y desea
que la funcin contine su proceso con esos datos. Cancelar indica que el usuario desea detener la
ejecucin de la funcin.
no modal, por otra parte, no impide que el usuario active otras ventanas mientras est abierto.
Cerrar para cerrar el cuadro de dilogo y puede proporcionar botones adicionales para ejecutar
funciones concretas, como un botn Buscar siguiente para buscar la palabra siguiente que
coincida con los criterios de una bsqueda de palabra.
Dialog Box Sample proporciona ejemplos relacionados.
Este tema contiene las secciones siguientes.

Cuadros de mensaje
Cuadros de dilogo comunes
Cuadros de dilogo personalizados
Temas relacionados

Cuadros de mensaje
cuadro de mensaje es un cuadro de dilogo que se puede utilizar para mostrar informacin textual
y permitirles que los usuarios tomen decisiones con botones.

MessageBox. MessageBox permite configurar el texto, el ttulo, el icono y los botones del cuadro
de mensaje, utilizando cdigo como el siguiente.

C#
VB
// Configure the message box to be displayed
string messageBoxText = "Do you want to save changes?";
string caption = "Word Processor";
MessageBoxButton button = MessageBoxButton.YesNoCancel;
MessageBoxImage icon = MessageBoxImage.Warning;

static Show, como se muestra en el cdigo siguiente.

C#
VB

// Display message box


MessageBox.Show(messageBoxText, caption, button, icon);

C#
VB
// Display message box
MessageBoxResult result = MessageBox.Show(messageBoxText, caption, button,
icon);
// Process message box results
switch (result)
{
case MessageBoxResult.Yes:
// User pressed Yes button
// ...
break;
case MessageBoxResult.No:
// User pressed No button
// ...
break;
case MessageBoxResult.Cancel:
// User pressed Cancel button
// ...
break;
}

MessageBox, MessageBox Sample y Dialog Box Sample.


MessageBox puede proporcionar una experiencia simple de usuario de cuadro de dilogo, la
ventaja de utilizar MessageBox es que se trata del nico tipo de ventana que pueden mostrar las
aplicaciones que se ejecutan dentro de un recinto de seguridad confiable parcial (vea Seguridad
(WPF)), tal como Aplicaciones del explorador XAML (XBAPs).

Cuadros de dilogo comunes


cuadros de dilogo comunes.

Abrir archivo (Dilogo)

OpenFileDialog y se encuentra en el espacio de nombres Microsoft.Win32.

C#
VB
// Configure open file dialog box
Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".txt"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension
// Show open file dialog box
Nullable<bool> result = dlg.ShowDialog();
// Process open file dialog box results
if (result == true)
{
// Open document
string filename = dlg.FileName;
}

Microsoft.Win32.OpenFileDialog.
Nota
OpenFileDialog se puede utilizar para recuperar sin ningn riesgo los nombres de archivo por
aplicaciones que se ejecutan con confianza parcial (vea Seguridad (WPF)).

Guardar archivo (Cuadro de dilogo)

SaveFileDialog y se encuentra en el espacio de nombres Microsoft.Win32.

C#
VB
// Configure save file dialog box
Microsoft.Win32.SaveFileDialog dlg = new Microsoft.Win32.SaveFileDialog();
dlg.FileName = "Document"; // Default file name
dlg.DefaultExt = ".text"; // Default file extension
dlg.Filter = "Text documents (.txt)|*.txt"; // Filter files by extension
// Show save file dialog box
Nullable<bool> result = dlg.ShowDialog();
// Process save file dialog box results

if (result == true)
{
// Save document
string filename = dlg.FileName;
}

Microsoft.Win32.SaveFileDialog.

Imprimir (Cuadro de dilogo)

PrintDialog y se encuentra en el espacio de nombres System.Windows.Controls.

C#
VB
// Configure printer dialog box
System.Windows.Controls.PrintDialog dlg = new
System.Windows.Controls.PrintDialog();
dlg.PageRangeSelection = PageRangeSelection.AllPages;
dlg.UserPageRangeEnabled = true;
// Show save file dialog box
Nullable<bool> result = dlg.ShowDialog();
// Process save file dialog box results
if (result == true)
{
// Print document
}

System.Windows.Controls.PrintDialog. Informacin general sobre impresin.

Cuadros de dilogo personalizados


Window implementa esos comportamientos y, por consiguiente, utiliza Window para crear
cuadros de dilogo modales y no modales personalizados.

Crear un cuadro de dilogo personalizado modal


Window para crear una implementacin de un cuadro de dilogo modal tpico, utilizando el

cuadro de dilogo Margins como ejemplo (vea Dialog Box Sample). Margins se muestra en la
figura siguiente.

Configurar un cuadro de dilogo modal


Aceptar en el que los usuarios hacen clic para cerrar el cuadro de dilogo, volver a la
funcin y continuar el proceso.
Cancelar en el que los usuarios hagan clic para cerrar el cuadro de dilogo y hacer que la
funcin detenga el proceso.
Cerrar en la barra de ttulo.
Minimizar, Maximizary Restaurar.
Sistema para minimizar, maximizar, restaurar y cerrar el cuadro de dilogo.
Cancelar. IsCancel del botn Cancelar en true.
Aceptar. IsDefault del botn Aceptar en true.

XAML
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.MarginsDialogBox"
xmlns:local="clr-namespace:SDKSample"
Title="Margins"
Height="190"
Width="300"
MinHeight="10"
MinWidth="300"
ResizeMode="CanResizeWithGrip"
ShowInTaskbar="False"
WindowStartupLocation="CenterOwner"
FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">
<Grid>
...
<!-- Accept or Cancel -->
<StackPanel Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="4">

<Button Name="okButton" Click="okButton_Click"


IsDefault="True">OK</Button>
<Button Name="cancelButton" IsCancel="True">Cancel</Button>
</StackPanel>
</Grid >
</Window>

VB
Imports System.Windows ' Window, RoutedEventArgs, IInputElement,
DependencyObject
Imports System.Windows.Controls ' Validation
Imports System.Windows.Input ' Keyboard
Namespace SDKSample
Public Class MarginsDialogBox
Inherits Window
Public Sub New()
Me.InitializeComponent()
End Sub
...
End Class
End Namespace

C#
using System.Windows; // Window, RoutedEventArgs, IInputElement,
DependencyObject
using System.Windows.Controls; // Validation
using System.Windows.Input; // Keyboard
namespace SDKSample
{
public partial class MarginsDialogBox : Window
{
public MarginsDialogBox()
{
InitializeComponent();
}
...

}
}

XAML
<!--Main Window-->
...
<MenuItem Name="formatMarginsMenuItem" Header="_Margins..."
Click="formatMarginsMenuItem_Click" />

Abrir un cuadro de dilogo modal

C#
VB
using
using
using
using
using

System; // EventArgs
System.ComponentModel; // CancelEventArgs
System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls; // TextChangedEventArgs
Microsoft.Win32; // OpenFileDialog

namespace SDKSample
{
public partial class MainWindow : Window
{
...
void formatMarginsMenuItem_Click(object sender, RoutedEventArgs e)
{
// Instantiate the dialog box
MarginsDialogBox dlg = new MarginsDialogBox();
// Configure the dialog box
dlg.Owner = this;
dlg.DocumentMargin = this.documentTextBox.Margin;

// Open the dialog box modally


dlg.ShowDialog();

...
}
...
}
}

Window.Owner con una referencia a la ventana que est mostrando el cuadro de dilogo.
Informacin general sobre ventanas de WPF para obtener ms informacin).
Nota
Informacin general sobre UI Automation) debe proporcionar un propietario.
ShowDialog.

Validar datos proporcionados por el usuario

ValidationRule. MarginValidationRule, que comprueba que un valor enlazado es Double y est


dentro de un intervalo especificado.

C#
VB
using System.Globalization;
using System.Windows.Controls;
namespace SDKSample
{
public class MarginValidationRule : ValidationRule
{
double minMargin;
double maxMargin;
public double MinMargin
{

get { return this.minMargin; }


set { this.minMargin = value; }

public double MaxMargin


{
get { return this.maxMargin; }
set { this.maxMargin = value; }
}
public override ValidationResult Validate(object value, CultureInfo
cultureInfo)
{
double margin;
// Is a number?
if (!double.TryParse((string)value, out margin))
{
return new ValidationResult(false, "Not a number.");
}
// Is in range?
if ((margin < this.minMargin) || (margin > this.maxMargin))
{
string msg = string.Format("Margin must be between {0} and
{1}.", this.minMargin, this.maxMargin);
return new ValidationResult(false, msg);
}
// Number is valid
return new ValidationResult(true, null);
}

Validate, que valida los datos y devuelve el objeto ValidationResult correspondiente.

XAML
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.MarginsDialogBox"
xmlns:local="clr-namespace:SDKSample"
Title="Margins"
Height="190"
Width="300"
MinHeight="10"
MinWidth="300"
ResizeMode="CanResizeWithGrip"
ShowInTaskbar="False"
WindowStartupLocation="CenterOwner"
FocusManager.FocusedElement="{Binding ElementName=leftMarginTextBox}">

<Grid>

...
<Label Grid.Column="0" Grid.Row="0">Left Margin:</Label>
<TextBox Name="leftMarginTextBox" Grid.Column="1" Grid.Row="0">
<TextBox.Text>
<Binding Path="Left" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:MarginValidationRule MinMargin="0" MaxMargin="10" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
...
</Window>

Aceptar botn. Aceptar, controlando el evento Click.

C#
VB
using System.Windows; // Window, RoutedEventArgs, IInputElement,
DependencyObject
using System.Windows.Controls; // Validation
using System.Windows.Input; // Keyboard
namespace SDKSample
{
public partial class MarginsDialogBox : Window
{
...
void okButton_Click(object sender, RoutedEventArgs e)
{
// Don't accept the dialog box if there is invalid data
if (!IsValid(this)) return;

...
}
// Validate all dependency objects in a window
bool IsValid(DependencyObject node)
{
// Check if dependency object was passed
if (node != null)
{
// Check if dependency object is valid.
// NOTE: Validation.GetHasError works for controls that have
validation rules attached
bool isValid = !Validation.GetHasError(node);
if (!isValid)
{
// If the dependency object is invalid, and it can receive
the focus,
// set the focus
if (node is IInputElement)
Keyboard.Focus((IInputElement)node);
return false;
}
}
// If this dependency object is valid, check all child dependency

objects

foreach (object subnode in LogicalTreeHelper.GetChildren(node))


{
if (subnode is DependencyObject)
{
// If a child dependency object is invalid, return false

immediately,

// otherwise keep checking


if (IsValid((DependencyObject)subnode) == false) return
false;

}
}
// All dependency objects are valid
return true;

GetHasError, el control no vlido obtiene el foco, el mtodo IsValid devuelve false y la ventana
se considera no vlida.

Establecer el resultado del dilogo modal

ShowDialog es fundamentalmente como llamar a un mtodo: el cdigo que abri el cuadro de


dilogo mediante ShowDialog espera hasta que vuelva ShowDialog. ShowDialog, el cdigo que
lo llam debe decidir si contina o detiene el procesamiento, segn si el usuario presion el botn
Aceptar o el botn Cancelar. Boolean que se devuelve desde el mtodo ShowDialog.
Aceptar, ShowDialog debe devolver true. DialogResult del cuadro de dilogo al hacer clic en el
botn Aceptar.
DialogResult tambin hace que la ventana se cierre automticamente, los que elimina la
necesidad de llamar explcitamente a Close.
Cancelar, ShowDialog debe devolver false, que tambin requiere que se establezca la propiedad
DialogResult.

C#
VB
using System.Windows; // Window, RoutedEventArgs, IInputElement,
DependencyObject
using System.Windows.Controls; // Validation
using System.Windows.Input; // Keyboard
namespace SDKSample
{
public partial class MarginsDialogBox : Window
{
...
void cancelButton_Click(object sender, RoutedEventArgs e)
{
// Dialog box canceled
this.DialogResult = false;
}
...

IsCancel de un botn se establece en true y el usuario presiona el botn Cancelar o la tecla ESC,
DialogResult se establece automticamente en false. Click.

XAML
<Button Name="cancelButton" IsCancel="True">Cancel</Button>

false cuando un usuario presiona el botn Cerrar de la barra de ttulo o elige el elemento de men
Cerrar en el men Sistema.

Procesar datos devueltos desde un cuadro de dilogo modal


DialogResult, la funcin que lo abri puede obtener el resultado del cuadro de dilogo
inspeccionando la propiedad DialogResult cuando vuelve ShowDialog.

C#
VB
using
using
using
using
using

System; // EventArgs
System.ComponentModel; // CancelEventArgs
System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls; // TextChangedEventArgs
Microsoft.Win32; // OpenFileDialog

namespace SDKSample
{
public partial class MainWindow : Window
{
...
void formatMarginsMenuItem_Click(object sender, RoutedEventArgs e)
{
...

// Process data entered by user if dialog box is accepted


if (dlg.DialogResult == true)
{
// Update fonts
this.documentTextBox.Margin = dlg.DocumentMargin;
}

...
}

true, la funcin lo utiliza como indicacin para recuperar y procesar los datos proporcionados por
el usuario.
Nota
ShowDialog, no se puede volver a abrir el cuadro de dilogo.
false, la funcin debe finalizar el procesamiento correctamente.

Crear un cuadro de dilogo personalizado no modal

Abrir un cuadro de dilogo no modal


Show.

XAML
<!--Main Window-->

VB
Imports
Imports
Imports
Imports
Imports

System ' EventArgs


System.ComponentModel ' CancelEventArgs
System.Windows ' Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls ' TextChangedEventArgs
Microsoft.Win32 ' OpenFileDialog

Namespace SDKSample
Public Class MainWindow
Inherits Window
...
Private Sub editFindMenuItem_Click(ByVal sender As Object, ByVal e As

RoutedEventArgs)
Dim dlg As New FindDialogBox(Me.documentTextBox)
dlg.Owner = Me
AddHandler dlg.TextFound, New TextFoundEventHandler(AddressOf
Me.dlg_TextFound)
dlg.Show()
End Sub
...
End Class
End Namespace

C#
using
using
using
using
using

System; // EventArgs
System.ComponentModel; // CancelEventArgs
System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls; // TextChangedEventArgs
Microsoft.Win32; // OpenFileDialog

namespace SDKSample
{
public partial class MainWindow : Window
{
...
void editFindMenuItem_Click(object sender, RoutedEventArgs e)
{
// Instantiate the dialog box
FindDialogBox dlg = new FindDialogBox(this.documentTextBox);
// Configure the dialog box
dlg.Owner = this;
dlg.TextFound += new TextFoundEventHandler(dlg_TextFound);
// Open the dialog box modally
dlg.Show();
}
...

ShowDialog, Show vuelve inmediatamente.

Procesar datos devueltos desde un cuadro de dilogo no modal


FindDialogBox puede devolver uno o ms resultados de bsqueda a la ventana principal, segn el
texto que se est buscando, sin ninguna frecuencia concreta. FindDialogBox implementa
TextFoundEvent para este propsito, que requiere primero un delegado.

C#
VB
using System;
namespace SDKSample
{
public delegate void TextFoundEventHandler(object sender, EventArgs e);
}

TextFoundEventHandler, FindDialogBox implementa TextFoundEvent.

C#
VB
using
using
using
using

System; // EventArgs
System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls; // TextBox, TextChangedEventArgs
System.Text.RegularExpressions; // Regex

namespace SDKSample
{
public partial class FindDialogBox : Window
{
public event TextFoundEventHandler TextFound;
protected virtual void OnTextFound()
{
TextFoundEventHandler textFound = this.TextFound;
if (textFound != null) textFound(this, EventArgs.Empty);
}
...

Find puede provocar el evento cuando se encuentra un resultado de bsqueda.

C#
VB
using
using
using
using

System; // EventArgs
System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls; // TextBox, TextChangedEventArgs
System.Text.RegularExpressions; // Regex

namespace SDKSample
{
public partial class FindDialogBox : Window
{
...
void findNextButton_Click(object sender, RoutedEventArgs e)
{
...
// Text found
this.index = match.Index;
this.length = match.Length;
OnTextFound();
...
}
...
}
}

C#
VB
using System; // EventArgs
using System.ComponentModel; // CancelEventArgs
using System.Windows; // Window, MessageBoxXxx, RoutedEventArgs

using System.Windows.Controls; // TextChangedEventArgs


using Microsoft.Win32; // OpenFileDialog
namespace SDKSample
{
public partial class MainWindow : Window
{
...
void dlg_TextFound(object sender, EventArgs e)
{
// Get the find dialog box that raised the event
FindDialogBox dlg = (FindDialogBox)sender;

}
}

// Get find results and select found text


this.documentTextBox.Select(dlg.Index, dlg.Length);
this.documentTextBox.Focus();

Cerrar un cuadro de dilogo no modal


DialogResult, un dilogo no modal se puede cerrar utilizando los mecanismos proporcionados
por el sistema, que incluyen los siguientes:
Cerrar en la barra de ttulo.
Cerrar en el men Sistema.
Close cuando se haga clic en el botn Cerrar.

C#
VB
using
using
using
using

System; // EventArgs
System.Windows; // Window, MessageBoxXxx, RoutedEventArgs
System.Windows.Controls; // TextBox, TextChangedEventArgs
System.Text.RegularExpressions; // Regex

namespace SDKSample
{
public partial class FindDialogBox : Window
{
...

void closeButton_Click(object sender, RoutedEventArgs e)


{
// Close dialog box
this.Close();
}
}

Vea tambin
Conceptos
Informacin general sobre el control Popup
Otros recursos
Dialog Box Sample
ColorPicker Custom Control Sample

Вам также может понравиться