Comment faites défiler vers le bas d'un ScrollViewer automatiquement avec Xaml et obligatoire?
J'ai un TextBlock
dont le contenu est lié aux données d'une chaîne de propriété du ViewModel. Cette TextBlock
a un ScrollViewer
enroulé autour d'elle.
Ce que je veux faire est de tous les temps, les journaux de changement, la ScrollViewer
seront faites défiler vers le bas. Idéalement, je veux quelque chose comme ceci:
<ScrollViewer ScrollViewer.HorizontalScrollBarVisibility="Auto"
ScrollPosition="{Binding Path=ScrollPosition}">
<TextBlock Text="{Binding Path=Logs}"/>
</ScrollViewer>
Je ne pas souhaitez utiliser le Code Derrière! La solution, je suis à la recherche devrait être à l'aide de seulement de liaison et/ou Xaml.
- une raison de pas de code derrière?
- Vous avez raison, mais à mon avis MVVM seulement suggère que la Logique d'Entreprise (Modèle de Vue) ne doit pas être mélangé avec votre INTERFACE utilisateur(Vue). Faites défiler la Visionneuse est l'INTERFACE utilisateur/Voir si nous avons mis un peu de code dans le code derrière pour déplacer ScrollViewer vers le bas, il ne sera pas contre MVVM parce que nous sommes juste de jouer avec l'INTERFACE utilisateur
- Je comprends et suis d'accord avec vous, mais je ne suis pas sûr que l'OP n'.
- Boogaart je veux un MVVM réponse pour trois raisons: 1 - je suis en utilisant le pattern MVVM, donc le premier type de réponse, je veux savoir est MVVM. 2 - j'ai trouvé le code derrière des réponses dans Google ou StackOverflow avant de demander de MVVM. Je ne voudrais pas avoir demandé une réponse sachant que je vais presque avoir le code derrière solutions 3 - C'est seulement quand je vais connaître tous les différents types de possibilités que je vais être capable de prendre la bonne choisi, ne vais-je pas? Ne vous inquiétez pas, je ne suis pas un zélote 😉
- MVVM n'
t deny code behind. I think the point of comments of @Harris and @Kent was that there
s non significatif raison d'écrire d'énormes constructions en XAML ou des classes d'aide juste pour éviter une seule ligne de code spécifique dans le code derrière.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez créer une propriété attachée à un comportement d'obtenir ce que vous voulez sans utiliser de code derrière. De toute façon vous aurez toujours besoin d'écrire du code.
Voici un exemple d'utilisation de la propriété attachée.
Propriété Attachée
De Liaison Xaml
Vous aurez besoin pour créer une propriété booléenne
IsLogsChangedPropertyInViewModel
et attribuez la valeur true lorsque la chaîne de propriété est modifiée.Espérons que cette aide! 🙂
Réponse mis à jour 2017-12-13, utilise maintenant ScrollChanged événement et vérifie si la taille de l'ampleur des changements. Plus fiable et n'interfère pas avec le manuel de défilement
Je sais que cette question est vieux, mais j'ai une meilleure mise en œuvre:
Le code est fortement influencé par les Deux Justin XL et Contango solutions
Utilisation:
AutoScrollPropertyChanged
méthode, laelse
peut être atteint lorsque l'scrollViewer
est nul, non seulement lors de lascrollViewer
n'est pasnull
etNewValue
estfalse
De Geoff Blog sur ScrollViewer AutoScroll Comportement.
Ajouter cette classe:
Ce code dépend de Fusion des Comportements, qui nécessitent une référence à
System.Windows.Interactivity
. Voir d'aide sur l'ajout deSystem.De Windows.L'interactivité
.Si vous installez le MVVM Light package NuGet, vous pouvez ajouter une référence ici:
Assurer que vous avez cette propriété dans votre en-tête, qui pointe à
System.Windows.Interactivity.dll
:Ajouter un Mélange de Comportement dans les
ScrollViewer
:Exemple:
Nous devons ajouter une définition de l'espace de noms, sinon ça ne savez pas où trouver de la classe C# nous venons d'ajouter. Ajouter cette propriété dans le
<Window>
tag. Si vous utilisez ReSharper, il suggère automatiquement pour vous.Maintenant, si tout va bien, le texte dans la zone seront toujours faites défiler vers le bas.
L'exemple de XAML avec de la volonté d'imprimer le contenu de la propriété liée
LogText
à l'écran, ce qui est parfait pour l'enregistrement.System.Windows.Interactivity.dll
qui a été fourni avec MVVM Light (comme indiqué dans la réponse). Si d'autres MVVM cadres ont été utilisés, ou même du code derrière, alors ce serait probablement très bien fonctionner. En d'autres termes, vous ne pouvez pas ajouter de multiples versions de ce.dll
à votre projet, si votre MVVM cadre comprend déjà.Il est facile, exemples:
Ici est une légère variation.
Ce sera faites défiler vers le bas lorsque le défilement de la visionneuse de hauteur (viewport) et la hauteur de défilement du présentateur de contenu (mesure) de changement.
Il est basé sur Roy T répondre, mais je n'étais pas en mesure de commenter si j'ai posté une réponse.
J'ai été en utilisant @Roy T. 's réponse, mais je voulais l'ajout stipulation que si vous défiler en arrière dans le temps, mais ensuite, ajout de texte, le défilement de l'affichage de l'auto de défilement vers le bas.
J'ai utilisé ceci:
en place de la SizeChanged événement.
<ScrollViewer Name="Scroller" Margin="0" behaviors:AutoScrollBehavior.AutoScroll="True">