新しいアイテムが追加されるたびに一番下までスクロールするItemsControlにアタッチされた動作があります。私はチャットタイプのプログラムに取り組んでいるので、ユーザーがスクロールバーを一番下以外の場所に持っている場合はスクロールしたくありません。そうしないと非常に煩わしくなります(一部のチャットプログラムはこれを実行し、ひどいです)。
どうすればこれを達成できますか?ラッピングするScrollViewerにアクセスする方法がわかりません。それ以外の場合は、それを表示する必要があるかどうかを判断します。
これは、StackOverflowの誰かから実際に取得した動作クラスです。私はまだ自分で行動について学んでいます。
public class ScrollOnNewItem : Behavior<ItemsControl>
{
protected override void OnAttached()
{
AssociatedObject.Loaded += OnLoaded;
AssociatedObject.Unloaded += OnUnLoaded;
}
protected override void OnDetaching()
{
AssociatedObject.Loaded -= OnLoaded;
AssociatedObject.Unloaded -= OnUnLoaded;
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
var incc = AssociatedObject.ItemsSource as INotifyCollectionChanged;
if (incc == null) return;
incc.CollectionChanged += OnCollectionChanged;
}
private void OnUnLoaded(object sender, RoutedEventArgs e)
{
var incc = AssociatedObject.ItemsSource as INotifyCollectionChanged;
if (incc == null) return;
incc.CollectionChanged -= OnCollectionChanged;
}
private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)
{
int count = AssociatedObject.Items.Count;
if (count == 0)
return;
var item = AssociatedObject.Items[count - 1];
var frameworkElement = AssociatedObject.ItemContainerGenerator.ContainerFromItem(item) as FrameworkElement;
if (frameworkElement == null) return;
frameworkElement.BringIntoView();
}
}
}