101 lines
3.6 KiB
C#
101 lines
3.6 KiB
C#
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();
|
|
}
|
|
}
|