Desde Blog de Geoff sur le comportement AutoScroll de ScrollViewer .
Ajoutez cette classe :
namespace MyAttachedBehaviors
{
/// <summary>
/// Intent: Behavior which means a scrollviewer will always scroll down to the bottom.
/// </summary>
public class AutoScrollBehavior : Behavior<ScrollViewer>
{
private double _height = 0.0d;
private ScrollViewer _scrollViewer = null;
protected override void OnAttached()
{
base.OnAttached();
this._scrollViewer = base.AssociatedObject;
this._scrollViewer.LayoutUpdated += new EventHandler(_scrollViewer_LayoutUpdated);
}
private void _scrollViewer_LayoutUpdated(object sender, EventArgs e)
{
if (Math.Abs(this._scrollViewer.ExtentHeight - _height) > 1)
{
this._scrollViewer.ScrollToVerticalOffset(this._scrollViewer.ExtentHeight);
this._height = this._scrollViewer.ExtentHeight;
}
}
protected override void OnDetaching()
{
base.OnDetaching();
if (this._scrollViewer != null)
{
this._scrollViewer.LayoutUpdated -= new EventHandler(_scrollViewer_LayoutUpdated);
}
}
}
}
Ce code dépend de Blend Behaviors, qui requiert une référence à System.Windows.Interactivity
. Voir aide pour ajouter System.Windows.Interactivity
.
Si vous installez le paquet NuGet MVVM Light, vous pouvez ajouter une référence ici :
packages\MvvmLightLibs.4.2.30.0\lib\net45\System.Windows.Interactivity.dll
Assurez-vous que vous avez cette propriété dans votre en-tête, qui pointe vers System.Windows.Interactivity.dll
:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Ajouter un comportement de mélange dans le ScrollViewer
:
<i:Interaction.Behaviors>
<implementation:AutoScrollBehavior />
</i:Interaction.Behaviors>
Exemple :
<GroupBox Grid.Row="2" Header ="Log">
<ScrollViewer>
<i:Interaction.Behaviors>
<implementation:AutoScrollBehavior />
</i:Interaction.Behaviors>
<TextBlock Margin="10" Text="{Binding Path=LogText, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TextWrapping="Wrap"/>
</ScrollViewer>
</GroupBox>
Nous devons ajouter une définition pour l'espace de noms, sinon il ne saura pas où trouver la classe C# que nous venons d'ajouter. Ajoutez cette propriété dans le fichier <Window>
étiquette. Si vous utilisez ReSharper, il vous le proposera automatiquement.
xmlns:implementation="clr-namespace:MyAttachedBehaviors"
Maintenant, si tout va bien, le texte dans la boîte défilera toujours vers le bas.
L'exemple XAML donné imprimera le contenu de la propriété liée. LogText
à l'écran, ce qui est parfait pour la journalisation.