J'ai une application WPF que je veux ressembler à elle est hébergée à l'intérieur d'une autre - application non WPF. Dans la vie réelle, cette application non-WPF est un ActiveX dans Internet Explorer, mais pour illustrer le problème, j'utilise une application simple Windows Forms.
J'utilise la fonction API Windows Setparent, selon laquelle il existe déjà des dizaines de threads. Cependant, je ne trouve rien d'écrit sur mon problème exact: Une petite région à droite et en bas de l'application WPF n'est pas peinte à l'intérieur de la fenêtre de l'application non-WPF B>. P>
Le Fenêtre WPF fonctionnant en soi:
p>
la fenêtre WPF avec la fenêtre de l'application Winform AS parent:
p>
Je n'ai pas l'expérience du problème si un échange de l'application WPF avec un Winforms app ou une application win32 plaine (comme le bloc-notes). P>
Le code WinForm ressemble à ceci: p> Remarque: je suis conscient que cette utilisation de Setparent n'est pas nécessairement une pratique recommandée, mais je tiens à déterminer comment le faire de cette façon, alors s'il vous plaît laissez-moi :) p> p>
3 Réponses :
Vous devez probablement redimensionner votre fenêtre WPF afin qu'il s'inscrit dans le zone client de sa nouvelle fenêtre parente:
Merci, vous avez raison sur la zone cliente. J'ai fait comme ci-dessus et une petite quantité est maintenant peinte à l'extérieur de la fenêtre mère qu'avant. Il semble également que la quantité peinte à l'extérieur de la droite est égale à la largeur des bordures de parent gauche et droite, et la quantité sur le fond est égale à la barre de titre et bordures du parent supérieur et inférieur. Si je fixais la frontière du parent sur "None", ça va bien. Quoi de neuf avec ça?
@JonsB, étrange, la zone client n'est pas censée prendre en compte les décorations de la fenêtre. Pouvez-vous p / invoquer getwindowrect () sur this.handle < / Code> et confirmer la largeur et la hauteur du résultat sont les mêmes que getClientRect () code>?
Oui, getClientRect ne prend pas en compte les décorations de la fenêtre et la fenêtre redimensionne en effet à la bonne taille. GetWindowrect () renvoie une autre largeur (plus grande) et une hauteur. Cependant, le contenu de la fenêtre WPF s'appuie en dehors de sa propre fenêtre.
J'ai trouvé une solution de contournement qui fonctionne assez bien: appelez MoveWindow avant Setparent: dans le gestionnaire d'événements Sizechanged, je prends l'enfant du parent, appelez MoveWindow et replacez-le dans le parent. Pour réduire les scintiles, je cache la fenêtre tout en faisant ces opérations: p> private void Form1_SizeChanged(object sender, EventArgs e)
{
ShowWindow(_process.MainWindowHandle, SW_HIDE);
var ptr = new IntPtr();
SetParent(_process.MainWindowHandle, ptr);
Rectangle rect;
GetClientRect(this.Handle, out rect);
MoveWindow(_process.MainWindowHandle, 0, 0, rect.Right - rect.Left, rect.Bottom - rect.Top, true);
SetParent(_process.MainWindowHandle, this.Handle);
ShowWindow(_process.MainWindowHandle, SW_SHOW);
}
Il est préférable d'utiliser EXECPROCESS.WAITFORINPUTIDLE () au lieu de thread.sleep (3000) pour attendre jusqu'à ce que le processus soit en marche et au ralenti ...
J'ai utilisé un formulaire / UserControl avec un panneau. Ensuite, j'ai utilisé le panneau comme nouveau parent et définissez la nouvelle position et la nouvelle taille du panneau avec SetWindowPos dans la fenêtre enfant. P>
Remarque: MS recommande d'utiliser SetWindowpos après avoir utilisé Setwindowlong (ou Setwindowlongptr) pour activer les nouveaux styles. P>
Je devrais ajouter que je pense que MoveWindow provoque le "coupure". Avant que tout va bien, mais le WPF a évidemment la mauvaise position et la mauvaise taille.
Ne serait-il pas plus facile d'utiliser Silverlight?
Je ne vois pas où vous définissez la taille de la fenêtre mère et c'est clairement trop petit. Vous devez former la fenêtre parente de sorte que, une fois que la zone non client est soustraite, la zone client est la taille dont vous avez besoin pour votre application WPF.
John Knoeller: J'ai essayé différentes tailles de démarrage pour la forme, y compris Maximisée, mais cela ne fait pas de différence. Les trucs WPF seront toujours peints à l'extérieur. (Je comprends que la petite taille de la forme ci-dessus peut être trompeuse)
GCATNM: Non, il s'agit d'une application .Net pleine blown, mais le client le souhaite à l'intérieur du navigateur. J'ai essayé de l'héberger à l'intérieur d'un processus normal, mais le processus IE pousse trop gros et se bloque (et Microsoft ne le recommande pas). XBAP pourrait être une solution à long terme, mais j'ai également besoin d'une solution rapide à court terme qui ne nécessite pas beaucoup de réécriture.