6
votes

Détecter le changement de flowdocument et faire défiler

Je tiens à détecter (de préférence par un événement) lorsque tout contenu est ajouté, modifié, etc. dans un flowdocument et quand je veux causer un flowdocumentscrollviewer Affichage du flowdocument pour faire défiler automatiquement jusqu'à la fin.


0 commentaires

4 Réponses :


2
votes

Utilisez-vous une richtextbox pour faire l'édition? Si oui, vous devriez simplement être capable de crochet Le textchanged événement puis appelle Le ScrollToverticalOffset méthode avec la valeur de Le ViewPorTheight Propriété .


1 commentaires

Non. Utilisation de flowdocumentsCrollviewer, pas Richtextbox.



10
votes

Vous pouvez détecter les modifications du fichier flowdocument en créant une plage de texte et en le surveillant pour les modifications. Le défilement vers le bas est plus difficile car vous devez trouver le ScrollViewer . Également pour la performance, vous ne voulez pas que vous ne souhaitaez pas de refaire tous les calculs de défilement de chaque modification, vous devez donc utiliser dispatcherations .

Mettre tout ensemble, ce code devrait faire le tour: < Pré> xxx

FindFirsvisualDescendantoftype est une simple recherche de préfixe de profondeur-première de l'arborescence visuelle à l'aide de VisualtreeHelper.getchildrencount () VisualtreeHelper. Getchild () et renvoyer le premier visuel trouvé du type spécifié.

Notez que pour une généralité complète, je ne précalcule pas ScrollViewer en haut du code car le flowdocumentsCrollViewer peut changer. Si cela ne se produira pas, ce code peut être accéléré en appelant .ApplyTemplate () sur le flowdocumentscrollviewer , puis informatique ScrollViewer avant l'événement Le gestionnaire est enregistré: xxx

Notez que nous ne pouvons pas simplement appeler ScrollViewer.getttemplatechild ("Part_conthostHost") et ignorer la recherche d'arborescence visuelle car Gettemplatechild est protégé.


1 commentaires

Je n'avais pas besoin de cela avec FlowDocument et FlowdocumentsCrollViewer Visual Tree Code. Juste 2 invoque, 1 pour créer et ajouter le paragraphe d'une chaîne et 1 pour mentionner ce paragraphe.



2
votes

Après avoir accroché à un événement textchanged, vous pouvez simplement utiliser:

public static ScrollViewer FindScroll(Visual visual)
        {
            if (visual is ScrollViewer)
                return visual as ScrollViewer;

            ScrollViewer searchChiled = null;
            DependencyObject chiled;

            for (int i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
            {
                chiled = VisualTreeHelper.GetChild(visual, i);
                if (chiled is Visual)
                    searchChiled = FindScroll(chiled as Visual);
                if (searchChiled != null)
                    return searchChiled;
            }

            return null;
        }

ScrollViewer scroller = FindScroll(YourReader as Visual);
if (scroller != null) 
   (scroller as ScrollViewer).ScrollToBottom();


1 commentaires

J'utilise seulement un flowdocument et des flowocumentsCrollViewer. La solution de Catherintoview ci-dessus fonctionne parfaitement pour moi. Je n'avais pas besoin de Visualtreeheehelper Ma solution consiste à utiliser Dispatcher.Invoke pour écrire Créer le paragraphe, stockez ce paragraphe en tant que variable et ensuite répartiteur.Invoke à nouveau pour la mettre en vue. Cela semble la méthode la plus simple.



0
votes

Vous pouvez utiliser la méthode d'extension suivante pour obtenir la visualiseur de défilement interne: xxx

Vous pouvez également utiliser ces méthodes d'extension avant d'ajouter du contenu pour vérifier la position de défilement de la vision de défilement elle-même (au cas où vous Voulez-vous faire défiler -Only- Si la visualiseur de défilement était déjà à la fin par exemple): xxx

Il suffit d'appeler ScrollViewer.scrolltoend () par exemple. < / p>


0 commentaires