Me gustaría mostrar mi Messagebox en el centro de su forma principal. si muevo el formulario y muestro el cuadro de mensaje, siempre aparece en el centro del escritorio. Quiero que aparezca junto con el formulario. ¿Me puede dar algunos trucos y consejos?MessageBox.Show()
Respuesta
La mejor manera de hacerlo es utilizar Window Hooks y centrar el cuadro de mensaje usted mismo. Hay un artículo perfecto que muestra este uso.
Se puede encontrar aquí: http://www.codeproject.com/KB/dialog/CenterDialog.aspx
También puede utilizar la clase en su aplicación sin bucear demasiado profundo para averiguar cómo funciona realmente.
Establezca el propietario de la ventana del cuadro de mensaje en su ventana (utilizando el primer parámetro de .Show()
), en lugar de no configurar un propietario.
Ver here para referencia.
¿Me puede dar algún ejemplo? He intentado esto: IWin32Window win = this; MessageBox.Show (win, "TESTING"); Aunque, el mismo resultado. Messagebox sigue apareciendo en el medio del escritorio –
Supongo que depende de qué es 'this'. Me temo que mi experiencia se limita a la función Win32 'MessageBox()' nativa, que es un poco diferente, y llegué a la mitad de la respuesta antes de darme cuenta de que estaba usando WinForms. Así que modifiqué mi respuesta para adaptarme a lo que encontré en la referencia, pero aún me faltan algunos detalles. :) –
Pasar un identificador de ventana a MessageBox no muestra el cuadro de mensaje en el centro del elemento primario. Es solo para permitir minimizar/maximizar con el elemento primario y no hay un icono de tarea específico para la ventana del cuadro de mensaje. – Yogesh
He hecho esto antes en C#. Esto es lo que recuerdo.
definir una clase:
public class IWindowWrapper : System.Windows.Forms.IWin32Window
{
public IWindowWrapper(IntPtr handle)
{
this.Handle= handle;
}
public IntPtr Handle
{
get;
set;
}
}
definir una clase de mensaje basado en. Crear una clase basada en cuadro de mensaje y crear un nuevo método Show:
public string Show(IWin32Window owner)
{
if(owner == null)
{
this.ShowDialog();
}
else
{
//parentWindow.
this.StartPosition = FormStartPosition.CenterParent;
this.ShowDialog(owner);
}
}
En su código de llamada (en este caso se supone que es un WinForm y MSGBOX se basa en la nueva clase de cuadro de mensaje) llamar al nuevo método Show y pasar una instancia de IWindowWrapper en Show, por ejemplo
msgBox.Show(new IWindowWrapper(this.Handle))
Aquí es muy fácil de usar solución, y funciona perfectamente:
Pasos:
- copiar y pegar esa clase en su proyecto. Lo usé sin ninguna edición.
- Para utilizar el cuadro de mensaje modificado, utilice esta línea de código en su proyecto:
(dentro de un UserControl
o una Form
)
MessageBoxEx.Show(this, "Please fix the validation errors before saving.", "Validation Errors");
Hice esta clase basada en una clase para Windows Forms que encontré en otra parte.
Sólo tiene que añadir la clase a su proyecto de WPF y proporcionar "esto" como un parámetro para el método de ayuda como esto:
MessageBoxHelper.PrepToCenterMessageBoxOnForm(this)"
A continuación, mostrar el cuadro de mensaje:
MessageBox.Show("Hello there!");
/// <summary>
/// This class makes it possible to center a MessageBox over the parent dialog.
/// Usage example:
/// MessageBoxHelper.PrepToCenterMessageBoxOnForm(this);
/// MessageBox.Show("Hello there!);
/// </summary>
public static class MessageBoxHelper
{
public static void PrepToCenterMessageBoxOnForm(Window window)
{
MessageBoxCenterHelper helper = new MessageBoxCenterHelper();
helper.Prep(window);
}
private class MessageBoxCenterHelper
{
private int messageHook;
private IntPtr parentFormHandle;
public void Prep(Window window)
{
NativeMethods.CenterMessageCallBackDelegate callBackDelegate = new NativeMethods.CenterMessageCallBackDelegate(CenterMessageCallBack);
GCHandle.Alloc(callBackDelegate);
parentFormHandle = new WindowInteropHelper(window).Handle;
messageHook = NativeMethods.SetWindowsHookEx(5, callBackDelegate, new IntPtr(NativeMethods.GetWindowLong(parentFormHandle, -6)), NativeMethods.GetCurrentThreadId()).ToInt32();
}
private int CenterMessageCallBack(int message, int wParam, int lParam)
{
NativeMethods.RECT formRect;
NativeMethods.RECT messageBoxRect;
int xPos;
int yPos;
if (message == 5)
{
NativeMethods.GetWindowRect(parentFormHandle, out formRect);
NativeMethods.GetWindowRect(new IntPtr(wParam), out messageBoxRect);
xPos = (int)((formRect.Left + (formRect.Right - formRect.Left)/2) - ((messageBoxRect.Right - messageBoxRect.Left)/2));
yPos = (int)((formRect.Top + (formRect.Bottom - formRect.Top)/2) - ((messageBoxRect.Bottom - messageBoxRect.Top)/2));
NativeMethods.SetWindowPos(wParam, 0, xPos, yPos, 0, 0, 0x1 | 0x4 | 0x10);
NativeMethods.UnhookWindowsHookEx(messageHook);
}
return 0;
}
}
private static class NativeMethods
{
internal struct RECT
{
public int Left;
public int Top;
public int Right;
public int Bottom;
}
internal delegate int CenterMessageCallBackDelegate(int message, int wParam, int lParam);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool UnhookWindowsHookEx(int hhk);
[DllImport("user32.dll", SetLastError = true)]
internal static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("kernel32.dll")]
internal static extern int GetCurrentThreadId();
[DllImport("user32.dll", SetLastError = true)]
internal static extern IntPtr SetWindowsHookEx(int hook, CenterMessageCallBackDelegate callback, IntPtr hMod, int dwThreadId);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool SetWindowPos(int hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, int uFlags);
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);
}
}
Olvidó decir * de dónde * robó este código. La atribución es importante aquí. Una búsqueda en Google muestra algunas fuentes posibles: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp, http://code.google .com/p/lioneditor/source/browse/branches/imageEditorv2/FFTPatcher/PatcherLib/MyMessageBox.cs? spec = svn468 & r = 468. –
Buena idea. Pero por favor, tenga en cuenta sus palabras: "robó" que es una expresión dura. Dije explícitamente "encontré otro lugar", pero tienes toda la razón sobre la atribución. –
Y no, el código original no proviene del enlace que ha agregado. Vino de Jason Carr: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp. Acabo de modificarlo para que funcione en WPF. Gracias Jason. –
- 1. MessageBox.Show() fuentes
- 2. MessageBox.Show-- cambio de fuente?
- 3. MessageBox.Show() Icono personalizado?
- 4. MessageBox.Show para Windows Phone 7
- 5. ¿Hay un Equivalente MessageBox.Show() en MonoCode
- 6. ¿Hay alguna diferencia entre MsgBox y MessageBox.Show?
- 7. C# seleccionar texto de messagebox.show popup
- 8. Mantener Messagebox.show() encima de otra aplicación usando C#
- 9. .NET: ¿Cómo hacer que Escape cierre un MessageBox.Show()?
- 10. ¿Por qué no puedo escribir MessageBox.Show ("asdfasdf {0}", i) ;?
- 11. ¿Por qué usar una ventana de propietario en MessageBox.Show?
- 12. Dispatcher lanza InvalidOperationException en Messagebox.Show en caso TextChanged
- 13. ¿Cómo hacer que MessageBox.Show() aparezca en el medio de mi aplicación WPF?
- 14. de lectura de correo electrónico sin Perspectiva aplicación abierta
- 15. C# Las variables estáticas - alcance y persistencia
- 16. Usando captura sin argumentos
- 17. C#: múltiples cláusulas catch
- 18. Cómo diferenciar entre la imagen en línea y el archivo adjunto en Outlook 2010 [C#]
- 19. ¿Cómo usar #define desde otro archivo?
- 20. tecla de función de manejo presione
- 21. C# DialogBox y DialogResult
- 22. Detect Enter Key C#
- 23. ¿Por qué la carga del formulario no puede detectar excepciones?
- 24. Error: ¿El método especificado no es compatible?
- 25. Cómo mostrar el valor impreso por consulta sql en el cuadro de mensaje
- 26. Compruebe si un puerto está abierto
- 27. CameraCaptureTask en WP7
- 28. C# - MessageBox - Localización de mensajes en recursos y saltos de líneas
- 29. ¿Cómo matar un hilo instantáneamente en C#?
- 30. Visual C# Haz clic con el botón secundario del botón
El artículo es genial. Solo necesito entenderlo antes de aplicarlo a mi aplicación. tnx. ¿Hay una manera mucho más fácil? heh .. –
La manera más fácil sería crear un nuevo MessageBox usted mismo. Eso será de acuerdo a su gusto y se verá de la manera que usted desea. Además, puede agregar cualquier funcionalidad que desee. – Yogesh