Autor Beitrag
relapse
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 08.06.12 12:41 
Hi,

meine Frage ist: Wie kann ich eine MessageBox (erzeugt von einem UserControl) in der Mitte des Parent-Fensters (von diesem UserControl) platzieren?




Danke!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.06.12 12:56 
Gibt die von .NET gekapselte MessageBox nicht so einfach her.
2. Möglichkeiten. Eine eigene MessageBox schreiben mit diesem Feature oder ein MessageHook auf das Aktivieren einer MessageBox setzen (SetWindowsHookEx auf HCBT_ACTIVATE) und in der MessageHookProc dann das Fenster passend verschieben (Da wir keine .NET Fenster haben vermutlich via MoveWindow API).
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Fr 08.06.12 13:31 
Ich würde mir eine eigen MSGBox erstellen, dann hast du die Properties von der WinForm.

_________________
Gruß
Christoph
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 08.06.12 13:46 
Oh-oh. Ich dachte das wird wesentlich einfacher. Ich hab' in meinem UserControl (übrigens ein WindowsFormsHost) Folgendes versucht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
            DependencyObject ucParent = this.Parent;

            while (!(ucParent is Window))
            {
                ucParent = LogicalTreeHelper.GetParent(ucParent);
            }

            var fenster = (IWin32Window)ucParent; // InvalidCastException
            InstanzEinerAnderenKlasse.ShowMessageBox(fenster, "Test!");

Ich bekomme aber (natürlich :D ) die Exception. Kann man denn irgendwie auf das Handle via diese ucParent-Variable zugreifen???
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.06.12 13:59 
Der IWin32Window Parameter wird beim MessageBox Show nur für die Z-Order benutzt. Heißt das die auch MessageBox garantiert vor diesem Fenster angezeigt wird. Aber nicht wo vor diesem Fenster. Wenn ein Window ein IWin32Window wäre würde dir das also auch nicht helfen.

Warum benutzt du die Winforms Message Box in einer WPF Applikation? WPF hat eine eigene (System.Windows.MessageBox). Die man aber genauso wenig frei auf dem Monitor platzieren kann.
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 08.06.12 14:50 
Zitat:
Warum benutzt du die Winforms Message Box in einer WPF Applikation? WPF hat eine eigene (System.Windows.MessageBox). Die man aber genauso wenig frei auf dem Monitor platzieren kann.


Schande! Ich hab's gar nicht gemerkt mit WPF-eigener MessageBox (einfach dumm den ersten Vorschlag von ReSharper übernommen)! Die lässt sich doch mittig zum Parent-Fenster platzieren! Ich übergebe dem UserControl bei seiner Initialisierung in EventHandler _Loaded des View (MVVM) den Verweis vom Typ "Window" auf das View. Dieser Verweis wird dann in einer Property von UserControl abgespeichert und bei Bedarf an die andere Klasse (Error-Handler) weitergeleitet:

ausblenden C#-Quelltext
1:
2:
3:
4:
        public static void ShowMessage(Window fenster, string meldung) // Error-Handler-Klasse 
        {
            System.Windows.MessageBox.Show(fenster, meldung, "Demo");
        }

Und schon funktioniert alles. Danke!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.06.12 15:16 
Das ist unerwartet. Bist du dir sicher das die MessageBox nicht doch einfach CenterScreen angezeigt wird?
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 08.06.12 15:22 
Absolut, da ich zwei Bildschirme habe. Sonst sah ich die Messabox immer in der Mitte vom Hauptbildschirm, obwohl mein View auf dem zweiten Bildschirm war. Ich muss mich aber korrigieren: Die MessageBox erscheit in der Mitte des UserControl, und nicht in der Mitte des gesamten Fensters.
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 08.06.12 15:29 
Und doch zu schnell geantwortet! Leider doch nicht in der Mitte des Fensters/UserControl, sondern lediglich in der Mitte des Bildschirms, aber zumindest auf dem richtigen Bildschirm (da, wo das Hauptfenster erscheint) 8)


Tja... Hab' mich schon soooo gefreut... Man kann halt nicht alles haben :lol:
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.06.12 15:55 
Soviel zur Relativität von Absolut ;)
relapse Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 50



BeitragVerfasst: Fr 08.06.12 16:14 
8)