Vorrei mostrare la mia Messagebox al centro del suo modulo padre. se sposto il modulo e mostro la messagebox, viene sempre visualizzato al centro del desktop. voglio che appaia insieme al modulo. Puoi darmi qualche consiglio e consiglio?MessageBox.Show()
risposta
Il modo migliore per farlo è utilizzare Window Hooks e centrare la finestra di messaggio. C'è un articolo perfetto che mostra questo utilizzo.
Lo si può trovare qui: http://www.codeproject.com/KB/dialog/CenterDialog.aspx
È inoltre possibile utilizzare la classe nell'applicazione senza immergersi troppo in profondità per scoprire come funziona realmente.
Impostare il proprietario della finestra della finestra di messaggio nella finestra (utilizzando il primo parametro di .Show()
), invece di non impostare un proprietario.
Vedere here per un riferimento.
Mi può dare qualche esempio? ho provato questo: IWin32Window win = this; MessageBox.Show (win, "TESTING"); Anche se, lo stesso risultato. Messagebox appare ancora nel mezzo del desktop –
Suppongo che dipenda da cosa sia questo. Ho paura che la mia esperienza sia limitata alla funzione nativa di 'MessageBox()' di Win32, che è un po 'diversa, e ho ottenuto a metà risposta prima di rendermi conto che stavi usando WinForms. Così ho modificato la mia risposta per adattarla a ciò che ho trovato nel riferimento, ma potrei avere ancora qualche dettaglio mancante. :) –
Il passaggio di un handle di finestra a MessageBox non visualizza la finestra di messaggio nel centro del padre. È solo per consentire minimizzare/massimizzare con il genitore e non esiste un'icona di attività specifica per la finestra della finestra di messaggio. – Yogesh
L'ho già fatto in C#. Ecco cosa ricordo
definire una classe:
public class IWindowWrapper : System.Windows.Forms.IWin32Window
{
public IWindowWrapper(IntPtr handle)
{
this.Handle= handle;
}
public IntPtr Handle
{
get;
set;
}
}
definire una classe base di MessageBox. Creare una classe basata su MessageBox e creare un nuovo metodo Show:
public string Show(IWin32Window owner)
{
if(owner == null)
{
this.ShowDialog();
}
else
{
//parentWindow.
this.StartPosition = FormStartPosition.CenterParent;
this.ShowDialog(owner);
}
}
Nel codice di chiamata (qui si presume essere una WinForm e MsgBox si basa sulla nuova classe finestra di messaggio) chiamare il nuovo metodo Show e passare un'istanza IWindowWrapper su Mostra ad es
msgBox.Show(new IWindowWrapper(this.Handle))
Ecco una soluzione facile da usare, e funziona perfettamente:
Passi:
- copiare e incollare questa classe nel progetto. L'ho usato senza alcun editing.
- Per utilizzare il MessageBox modificato, utilizzare questa riga di codice nel progetto:
(all'interno di un UserControl
o un Form
)
MessageBoxEx.Show(this, "Please fix the validation errors before saving.", "Validation Errors");
ho fatto questa classe sulla base di una classe per Windows Forms che ho trovato da nessun'altra parte.
Basta aggiungere la classe al progetto WPF e fornire "questo" come parametro per il metodo di supporto in questo modo:
MessageBoxHelper.PrepToCenterMessageBoxOnForm(this)"
poi mostrare la finestra di messaggio:
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);
}
}
Hai dimenticato di dire * dove * hai rubato questo codice da. L'attribuzione è importante qui. Una ricerca su Google mostra un paio di possibili fonti: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp, http://code.google .com/p/lioneditor/source/sfoglia/rami/imageEditorv2/FFTPatcher/PatcherLib/MyMessageBox.cs? spec = svn468 & r = 468. –
Buona idea. Ma per favore ricorda le tue parole: "rubato" che è un'espressione dura. Ho detto esplicitamente "trovato altrove", ma hai assolutamente ragione sull'attribuzione. –
E no, il codice originale non è venuto dal link che hai aggiunto. Veniva da Jason Carr: http://www.jasoncarr.com/technology/centering-a-message-box-on-the-active-window-in-csharp. L'ho appena modificato per funzionare in WPF. Grazie Jason. –
- 1. Font MessageBox.Show()
- 2. MessageBox.Show per Windows Phone 7
- 3. Messagebox.Show e DialogResult equivalenti in MonoTouch
- 4. Mantieni Messagebox.show() sopra un'altra applicazione usando C#
- 5. C# seleziona il testo da messagebox.show popup
- 6. Come creare un collegamento ipertestuale in MessageBox.show?
- 7. C'è una differenza tra MsgBox e MessageBox.Show?
- 8. .NET: come avere Escape chiude un MessageBox.Show()?
- 9. Come richiamare MessageBox.Show() nel mezzo della mia applicazione WPF?
- 10. Dispatcher getta InvalidOperationException su Messagebox.Show in evento TextChanged
- 11. Come hai implementato con successo la funzionalità MessageBox.Show() in MVVM?
- 12. Come posso utilizzare Messagebox.Show in modalità asincrona su Windows Phone 8?
- 13. Come scrivere un apice in una stringa e visualizzarlo usando MessageBox.Show()?
- 14. C# DialogBox e DialogResult
- 15. Utilizzando cattura senza argomenti
- 16. come mostrare Messagebox in MVVM
- 17. Switch: più valori in un caso?
- 18. Rileva tasto Invio C#
- 19. tasto di manipolazione premere il tasto
- 20. Comportamento previsto con uno spazio bianco nella riga di comando
- 21. Control.Invoke scarta l'eccezione esterno e propaga l'eccezione interna invece
- 22. Come usare #define da un altro file?
- 23. Accoppiamento Bluetooth (SSP) su Windows 10 con 32feet.NET
- 24. Dynamics CRM SDK in C# connettersi con password non valida
- 25. Perché il caricamento del modulo non può rilevare l'eccezione?
- 26. Rileva il tasto di tabulazione Premere in TextBox
- 27. Devo invocare chiamate MessageBox?
- 28. Modulo di visualizzazione di Visual C# tasto destro
- 29. Perché i valori non sono convertibili in modo implicito in stringa in C#?
- 30. ConfigurationManager non salva le impostazioni
L'articolo è fantastico. Devo solo capirlo prima di applicarlo alla mia app. tnx. c'è un modo molto più semplice? heh .. –
Il modo più semplice sarebbe creare un nuovo modulo MessageBox da solo. Questo sarà secondo il tuo gusto e sembrerà come vuoi che sia. Inoltre, puoi aggiungere qualsiasi funzionalità che ti piace. – Yogesh