2010-01-08 7 views
0

J'ai un wpf Usercontrol, à l'intérieur j'utilise un pdfviewer Winforms pour afficher les fichiers pdf. J'ai aussi deux boîtes de texte pour entrer les détails du document. enfin, un popup qui affiche ce contrôle utilisateur. Le problème est que lorsque j'essaie de taper quelque chose dans les zones de texte, ntn arrive. quand je fais un clic droit sur une zone de texte, je peux voir le menu contextuel avec des options couper, copier et coller. Après googling peu, j'ai trouvé quelque chose comme ci-dessous, Forms.Integration.WindowsFormsHost.EnableWindowsFormsInterop(), j'ai placé cette ligne dans l'événement chargé, mais cela ne fonctionne pas. quelqu'un peut-il faire face à un problème simillar et avoir des solutions. Merci. ReyWindowsFormsHost Winform problème de contrôle pdfviewer

Répondre

1

J'ai rencontré ce problème il y a un certain temps. Si je me souviens bien, c'était un bug dû à la boucle de message WPF de haut niveau qui ne jouait pas bien avec la boucle de message WinForms.

La solution que j'ai utilisée était de changer ma couche externe d'une fenêtre WPF à un formulaire WinForms. En d'autres termes, je l'ai remplacé

new Window { Content = CreateContent(), Title = title }.Show(); 

avec

new ElementHostForm(CreateContent(), title).Show(); 

en utilisant une classe comme ceci:

class ElementHostForm : System.Windows.Forms.Form 
{ 
    ElementHost _host; 

    public WinFormsWindow(UIElement content, string title) 
    { 
    _host = new ElementHost { Child = content }; 
    Controls.Add(host); 

    content.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity)); 
    if(content.DesiredSize.Width > 100 && content.DesiredSize.Height > 100) 
     ClientSize = _host.Size = 
     new Size((int)content.DesiredSize.Width, (int)content.DesiredSize.Height)); 

    content.ClearValue(FrameworkElement.WidthProperty); 
    content.ClearValue(FrameworkElement.HeightProperty); 

    Title = title; 
    } 

    protected override void OnResize(EventArgs e) 
    { 
    if(!ClientSize.IsEmpty) _host.Size = ClientSize; 
    base.OnResize(e); 
    } 
} 

Cela a fonctionné autour du bug en permettant WinForms d'avoir la boucle de message externe.

Ce changement a été très facile pour moi parce que j'avais déjà mon contenu de niveau supérieur dans un UserControl séparé (pas une fenêtre). Si votre contenu de niveau supérieur est une fenêtre, vous devrez peut-être refactoriser.

Questions connexes