Da Geoff's Blog on ScrollViewer AutoScroll Behavior.
Aggiungi questa 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);
}
}
}
}
Questo codice dipende Comportamenti Blend, che richiedono un riferimento a System.Windows.Interactivity
. Vedi help on adding System.Windows.Interactivity
.
Se si installa il pacchetto MVVM Luce NuGet, è possibile aggiungere un riferimento qui:
packages\MvvmLightLibs.4.2.30.0\lib\net45\System.Windows.Interactivity.dll
Assicurarsi di disporre di questa proprietà nella tua intestazione, che punta a System.Windows.Interactivity.dll
:
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
Add un comportamento di fusione nel ScrollViewer
:
<i:Interaction.Behaviors>
<implementation:AutoScrollBehavior />
</i:Interaction.Behaviors>
Esempio:
<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>
dobbiamo aggiungere una definizione per lo spazio dei nomi, altrimenti non saprà dove trovare la classe C# che abbiamo appena aggiunto. Aggiungi questa proprietà nel tag <Window>
. Se stai usando ReSharper, lo suggerirà automaticamente per te.
xmlns:implementation="clr-namespace:MyAttachedBehaviors"
Ora, se tutto va bene, il testo nella casella scorrerà sempre verso il basso.
L'esempio XAML fornito stamperà il contenuto della proprietà associata LogText
sullo schermo, che è perfetto per la registrazione.
alcun motivo specifico di nessun codice dietro? –
Immagino che sia una convinzione religiosa che codice dietro e MVVM non si mescoleranno. –
Hai ragione ma secondo me MVVM suggerisce solo che la tua Business Logic (Vedi modello) non deve essere mescolata con la tua interfaccia utente (vista). Scroll Viewer è UI/View se mettiamo un po 'di codice nel codice per spostare ScrollViewer in basso non sarà contro MVVM perché stiamo solo giocando con l'interfaccia utente –