using System.Windows; using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Media; using System.Windows.Threading; namespace Main.Test; public partial class StyledDataGrid { private DispatcherTimer? imageResumeTimer; private bool draggingScrollThumb; private void InitializeImageLoadingPause() { imageResumeTimer = new DispatcherTimer(DispatcherPriority.Background, Dispatcher) { Interval = TimeSpan.FromMilliseconds(500) }; imageResumeTimer.Tick += (_, _) => { imageResumeTimer.Stop(); if (!draggingScrollThumb && IsLoaded) SetImageLoadingSuspended(false); }; AddHandler(Thumb.DragStartedEvent, new DragStartedEventHandler(ScrollThumbDragStarted), true); AddHandler(Thumb.DragCompletedEvent, new DragCompletedEventHandler(ScrollThumbDragCompleted), true); AddHandler(ScrollViewer.ScrollChangedEvent, new ScrollChangedEventHandler(ImageScrollChanged), true); Unloaded += (_, _) => { imageResumeTimer.Stop(); draggingScrollThumb = false; SetImageLoadingSuspended(true); }; Loaded += (_, _) => { ApplyImageLoadingOptions(); SetImageLoadingSuspended(false); }; ApplyImageLoadingOptions(); } private void SetImageLoadingSuspended(bool suspended) { SetValue(IsImageLoadingSuspendedPropertyKey, suspended); NetworkThumbnail.SetIsLoadingSuspended(this, suspended); } private void ApplyImageLoadingOptions() { NetworkThumbnail.SetCacheEnabled(this, EnableImageCache); if (imageResumeTimer == null) return; if (!PauseImageLoadingWhileDragging) { imageResumeTimer.Stop(); draggingScrollThumb = false; SetImageLoadingSuspended(false); } } private bool IsOwnScrollBar(DependencyObject? source) { var foundScrollBar = false; for (var parent = source; parent != null; parent = VisualTreeHelper.GetParent(parent)) { if (parent is ScrollBar) foundScrollBar = true; if (parent is DataGrid) return ReferenceEquals(parent, this) && foundScrollBar; } return false; } private void ScrollThumbDragStarted(object sender, DragStartedEventArgs e) { if (!PauseImageLoadingWhileDragging || !IsOwnScrollBar(e.OriginalSource as DependencyObject)) return; draggingScrollThumb = true; imageResumeTimer!.Stop(); // 继承到可见图片及随后回收生成的新行,立即取消请求并清空图片。 SetImageLoadingSuspended(true); } private void ScrollThumbDragCompleted(object sender, DragCompletedEventArgs e) { if (!PauseImageLoadingWhileDragging || !IsOwnScrollBar(e.OriginalSource as DependencyObject)) return; draggingScrollThumb = false; RestartImageResumeTimer(); } private void ImageScrollChanged(object sender, ScrollChangedEventArgs e) { if (!NetworkThumbnail.GetIsLoadingSuspended(this) || draggingScrollThumb || (e.VerticalChange == 0 && e.HorizontalChange == 0) || !IsOwnScrollViewer(e.OriginalSource as DependencyObject)) return; RestartImageResumeTimer(); } private bool IsOwnScrollViewer(DependencyObject? source) { for (var parent = source; parent != null; parent = VisualTreeHelper.GetParent(parent)) if (parent is DataGrid) return ReferenceEquals(parent, this); return false; } private void RestartImageResumeTimer() { imageResumeTimer!.Stop(); imageResumeTimer.Start(); } }