WPF Window in andere Anwendung einbetten
-
Guten Mittag zusammen,
ich stehe vor einem kleinen Problem. Ich habe eine Anwendung die ich erweitern muss. Diese Anwendung ist gekauft und der Quellcode liegt mir nicht vor. Das einzige was ich weiß ist, dass es ebenfalls .NET Code ist. Sollte aber glaube ich uninteressant sein.
Bei der Erweiterung handelt es sich um eine Applikation, die wir selbst erstellen und die sich in ein Control einbetten soll. Im Prinzip läuft es so, dass wir uns den Handle des Controls holen und dann positionieren wie unser Fenster darin. Soll halt ein bisschen so aussehen als müsste es dort hin;-)Eigentlich klappt das auch schon so lala... aber eben nur so lala
Ich poste erstmal den Code der in einer Endlosschleife ständig unser Fenster neu positioniert
Async(0, delegate { bool flag = true; while (flag) { Dispatcher.Invoke((Action) (() => { #region Wurde geschlossen? if (!IsWindow(_parentWindow.HWnd)) { flag = false; Close(); } #endregion #region Ist sichtbar else if (IsWindowEnabled(_parentWindow.HWnd)) { if (Visibility == Visibility.Collapsed) { Visibility = Visibility.Visible; } if (Top != _parentWindow.Rectangle.Top || Left != _parentWindow.Rectangle.Left || Height != _parentWindow.Rectangle.Height || Width != _parentWindow.Rectangle.Width) { Top = _parentWindow.Rectangle.Top; Left = _parentWindow.Rectangle.Left; Height = _parentWindow.Rectangle.Height; Width = _parentWindow.Rectangle.Width; } } #endregion #region Ist unsichtbar else { if (Visibility != Visibility.Collapsed) { Visibility = Visibility.Collapsed; } } #endregion })); Thread.Sleep(100); } return 0; }, (res => { }));
Problem 1: Das Control in dem wir uns einbetten liegt in einem Tab. Wenn ich jetzt zwischen den Tabs hin und her wechsel, dann wird unsere Anwendung mal versteckt und mal nicht. Irgendwie läuft das nicht so ganz sauber. Ich müsste hier nämlich zuverlässig wissen, ob mein Parent jetzt auf den Screen gezeichnet ist oder nicht. Abhängig davon blende ich mein Fenster mit Hide() oder so aus. Was könnte man tun?
Problem 2: Wir arbeiten hier mit einer Verzögerung von 100 Millisekunden. Es wäre doch schöner, wenn unser Fenster nur dann reagieren würde, wenn auch was passiert. Ich müsste also irgendwie an die MessageLoop kommen. Kann man das so eben?
Jemand Ideen?
P.S.: Ich weiß, das man IsWindowEnabled nicht aufrufen soll wenn man sie selbst nicht erstellt hat da ein Window geschlossen und ein anderes Window mit dem selben HWND erstellt werden kann. Das wird aber mal nicht beachtet.
-
Was du da machen willst halte ich für höchst Fragwürdig und eher für ein Hack als alles andere. Aber ggf zur Lösung:
hast du es mal mitControl.FromHandle(handle)
probiert. Deinen Code nach zur folge hast du das Handle deines Parents ja. Wenn du es in ein Control umwandeln kannst kannst du dich dort an die entsprechenden Events ranhängen. Ich bin mir nur incht sicher ob das so funktioniert. Würde aber auf einen Versuch ankommen.