2010-10-25 19 views
0

J'utilise un document HTML pour afficher la sortie de texte dans mon application - cela me donne la flexibilité du HTML et la puissance du CSS, et je peux publier le HTML généré comme un fichier journal ouvrable dans n'importe quel navigateur. Lorsque de nouvelles informations sont disponibles, je mets à jour le fichier HTML, puis j'appelle Refresh() sur mon contrôle WebBrowser. Naturellement, je veux que l'utilisateur voie les informations les plus récentes sans avoir à défiler manuellement vers le bas, alors Je dois faire défiler automatiquement vers le bas du document après le navigateur actualise et les changements ont été rendus.Comment faire défiler automatiquement vers le bas d'un document HTML chargé dans un WebBrowser ou un cadre?

J'ai le code pour faire défiler vers le bas:

(this.browser.Document as HTMLDocument).body.scrollIntoView(false); 

Le problème est que j'ai essayé beaucoup d'événements, et tous le feu avant que le contrôle du navigateur Web a effectivement fini rendu la source mise à jour, donc je finis par défiler vers le bas avant que le nouveau contenu ne soit affiché! C'est incroyablement frustrant - est-ce que quelqu'un sait comment résoudre ce problème? Comment puis-je savoir quand le nouveau contenu est complètement terminé pour que je puisse défiler vers le bas?

EDIT: J'ai essayé enfermer un cadre dans un ScrollViewer:

<ScrollViewer x:Name="scrollBar" Grid.Row="1" Grid.Column="0"> 
    <Frame Name="browserBox" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" NavigationUIVisibility="Hidden"/> 
</ScrollViewer> 

Cela fonctionne très bien pour les pages d'application (page de classe), car le cadre pousse assez grand pour la page entière, ce qui provoque l'ScrollViewer enfermant à Ajuster et déclencher un événement ScrollChanged. J'ai été momentanément très excité, mais j'ai découvert que malheureusement, quand je charge un fichier HTML dans le cadre, le cadre ne se redimensionne pas pour s'adapter au contenu, mais présente sa propre barre de défilement, maintenant j'ai une barre de défilement à l'intérieur d'un autre, et je ne peux pas m'abonner à des événements pour la barre de défilement interne. ! :(

Répondre

1

OMG j'ai trouvé la réponse Basé sur un indice que je trouve dans this post:

Enrouler un cadre avec une visionneuse de défilement et abonnez-vous à l'événement ContentRendered du cadre:

<ScrollViewer x:Name="scrollViewer"> 
    <Frame x:Name="frame" Source="pack://siteoforigin:,,,/HTMLPage1.htm" NavigationUIVisibility="Hidden" ContentRendered="Frame_ContentRendered" /> 
</ScrollViewer> 

Le rendu , mesurer la teneur en HTML et mettre à jour la taille du cadre (ajouter une référence à l'assemblage .NET Microsoft.mshtml):

using mshtml; 

private void Frame_ContentRendered(object sender, EventArgs e) 
{ 
    HTMLDocument htmlDoc = ((this.frame.Content as WebBrowser).Document as mshtml.HTMLDocument); 

    if (htmlDoc != null && htmlDoc.body != null) 
    { 
     mshtml.IHTMLElement2 body = (mshtml.IHTMLElement2)htmlDoc.body; 
     this.frame.Width = body.scrollWidth; 
     this.frame.Height = body.scrollHeight; 
    } 

    this.scrollViewer.ScrollToEnd(); 
} 

Enfin, éliminer la barre de défilement hous ed dans le cadre en désactivant le défilement dans votre document HTML lui-même:

<body scroll="no"> 

Woohoo! Je vais aller faire la fête maintenant. Faire défiler vers le bas d'un document HTML ne devrait pas avoir pris une semaine (mais il l'a fait).