2009-02-04 6 views
5

Ich habe eine Windows Forms Map in einem WindowsFormsHost, und ich brauche es, um die Größe mit dem Fenster zu ändern.Woher weiß ich, wenn WindowsFormsHost die Größe in WPF ändert?

Ich bin nur nicht sicher, welches Ereignis zu hören, um dies zu tun. Ich brauche die Größe der Karte nur, wenn die Maus hochgeklappt ist, sonst verfällt sie und versucht sich millionenfach selbst zu zeichnen, wenn man ein Fenster sehr langsam in der Größe verändert.

Antwort

7

Warten auf einen Timer ist eine sehr, sehr schlechte Idee, ganz einfach, es ist eine Heuristik und Sie erraten, wann die Größenänderung durchgeführt wird.

Eine bessere Idee wäre, eine Klasse von WindowsFormsHost abzuleiten und überschreiben die WndProc-Methode, Umgang mit der WM_SIZE Nachricht. Dies ist die Nachricht, die an ein Fenster gesendet wird, wenn die Größenoperation abgeschlossen ist (im Gegensatz zu WM_SIZING, die während des Prozesses gesendet wird).

Sie können auch die WM_SIZING Nachricht behandeln, und nicht die Basisimplementierung von WndProc aufrufen, wenn Sie diese Nachricht erhalten, um zu verhindern, dass die Nachricht verarbeitet wird und die Map sich all diese Male neu zeichnen lässt.

Die Dokumentation für die WndProc Methode auf der Control Klasse zeigt, wie WndProc Methode außer Kraft zu setzen:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc(VS.71).aspx

Auch wenn es für eine andere Klasse ist, dann ist es genau das gleiche Haupt.

Darüber hinaus müssen Sie die Werte für den WM_SIZING und WM_SIZE Konstanten, die Sie hier finden können:

http://www.pinvoke.net/default.aspx/Enums/WindowsMessages.html

Beachten Sie, dass Sie nicht alles aus dem obigen Link benötigen, nur um die Erklärungen für diese beiden Werte:

/// <summary> 
/// The WM_SIZING message is sent to a window that 
/// the user is resizing. By processing this message, 
/// an application can monitor the size and position 
/// of the drag rectangle and, if needed, change its 
/// size or position. 
/// </summary> 
const int WM_SIZING = 0x0214; 

/// <summary> 
/// The WM_SIZE message is sent to a window after its 
/// size has changed. 
/// </summary> 
const int WM_SIZE = 0x0005; 
+0

Ich löschte meine Antwort, ich wollte nicht davon ausgehen, dass Sie den Timer die ganze Zeit laufen sollten. In jedem Fall interessiert mich diese Methode. Irgendwelche Verbindungen oder Proben? – bendewey

+0

pinvoke.net ist dein Freund ... =) –

-3

Per Vorschlag hier:

http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/8453ab09-ce0e-4e14-b30b-3244b51c13c4

Sie schlagen vor, den Timer zu verwenden, und jedes Mal, wenn das SizeChanged-Ereignis ausgelöst wird, starten Sie einfach den Timer neu. Auf diese Weise ruft der Timer nicht ständig "Tick" an, um zu überprüfen, ob sich die Größe geändert hat - der Timer wird nur einmal pro Größenänderung ausgelöst. Vielleicht weniger als ideal, aber ich muss mich nicht mit irgendwelchen Low-Level-Windows-Sachen herumschlagen. Dieser Ansatz funktioniert auch für alle wpf-Benutzersteuerelemente, nicht nur für wpf-Fenster.

Verwandte Themen