合并控件
This commit is contained in:
1 parent
233ec5d58d
commit
b842292817
11 files changed
+1400
-463
No files matched your search
@@ -0,0 +1,100 @@
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user