重新修改了代码,更精简了一些
- 数据更新时,滚动条滚动到底部
- 滑动鼠标滚轮、点击滚动条滑块、选择条目都停止滚动条滚动到底部
- 按下空格键恢复自动滚动条
public partial class DataWindow : Window
{
private bool IsAutoScrollToEnd { get; set; }
private ScrollViewer Scroll { get; set; }
public DataWindow()
{
InitializeComponent();
this.Loaded += DataWindow_Loaded;
}
private void DataWindow_Loaded(object sender, RoutedEventArgs e)
{
this.Scroll = VisualTreeHelper.GetChild(VisualTreeHelper.GetChild(this.DataGrid, 0), 0) as ScrollViewer;
this.Scroll.ScrollChanged += AutoScrollToEnd;
this.Scroll.GotMouseCapture += DisableAutoScrollToEnd;
this.DataGrid.SelectionChanged += DisableAutoScrollToEnd;
this.DataGrid.PreviewMouseWheel += DisableAutoScrollToEnd;
this.DataGrid.KeyDown += EnableAutoScrollToEnd;
this.IsAutoScrollToEnd = true;
}
private void AutoScrollToEnd(object sender, ScrollChangedEventArgs e)
{
if (e.ExtentHeightChange > 0 && this.IsAutoScrollToEnd)
{
(sender as ScrollViewer).ScrollToEnd();
}
}
private void EnableAutoScrollToEnd(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space && !this.IsAutoScrollToEnd)
{
this.IsAutoScrollToEnd = true;
this.Scroll.ScrollToEnd();
}
}
private void DisableAutoScrollToEnd(object sender, EventArgs e)
{
if (this.IsAutoScrollToEnd) this.IsAutoScrollToEnd = false;
}
}
目前没想到更好的方法