Skip to content

Commit e16a9d7

Browse files
committed
Merge in 'release/3.1' changes
2 parents 2a82242 + e4b4db8 commit e16a9d7

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/VirtualizingStackPanel.cs

+30-19
Original file line numberDiff line numberDiff line change
@@ -931,16 +931,19 @@ private void OnAnchorOperation(bool isAnchorOperationPending)
931931
// situations where the viewport size has changed)
932932
if (!success)
933933
{
934+
double computedOffset, maxOffset;
934935
if (isHorizontal)
935936
{
936-
success = DoubleUtil.GreaterThanOrClose(_scrollData._computedOffset.X,
937-
_scrollData._extent.Width - _scrollData._viewport.Width);
937+
computedOffset = _scrollData._computedOffset.X;
938+
maxOffset = _scrollData._extent.Width - _scrollData._viewport.Width;
938939
}
939940
else
940941
{
941-
success = DoubleUtil.GreaterThanOrClose(_scrollData._computedOffset.Y,
942-
_scrollData._extent.Height - _scrollData._viewport.Height);
942+
computedOffset = _scrollData._computedOffset.Y;
943+
maxOffset = _scrollData._extent.Height - _scrollData._viewport.Height;
943944
}
945+
success = LayoutDoubleUtil.LessThan(maxOffset, computedOffset) ||
946+
LayoutDoubleUtil.AreClose(maxOffset, computedOffset);
944947
}
945948
}
946949
}
@@ -973,21 +976,22 @@ private void OnAnchorOperation(bool isAnchorOperationPending)
973976
else
974977
{
975978
bool remeasure = false;
976-
double actualOffset, expectedOffset;
979+
double actualOffset, expectedOffset, maxOffset;
977980

978981
if (isHorizontal)
979982
{
980983
_scrollData._computedOffset.X = prevFirstContainerOffset - prevFirstContainerOffsetFromViewport;
981984

982985
actualOffset = _scrollData._computedOffset.X + actualDistanceBetweenViewports;
983986
expectedOffset = _scrollData._computedOffset.X + _scrollData._expectedDistanceBetweenViewports;
987+
maxOffset = _scrollData._extent.Width - _scrollData._viewport.Width;
984988

985-
if (DoubleUtil.LessThan(expectedOffset, 0) || DoubleUtil.GreaterThan(expectedOffset, _scrollData._extent.Width - _scrollData._viewport.Width))
989+
if (LayoutDoubleUtil.LessThan(expectedOffset, 0) || LayoutDoubleUtil.LessThan(maxOffset, expectedOffset))
986990
{
987991
// the condition can fail due to estimated sizes in subtrees that contribute
988992
// to FindScrollOffset(_scrollData._firstContainerInViewport) but not to
989993
// _scrollData._extent. If that happens, remeasure.
990-
if (DoubleUtil.AreClose(actualOffset, 0) || DoubleUtil.AreClose(actualOffset, _scrollData._extent.Width - _scrollData._viewport.Width))
994+
if (LayoutDoubleUtil.AreClose(actualOffset, 0) || LayoutDoubleUtil.AreClose(actualOffset, maxOffset))
991995
{
992996
_scrollData._computedOffset.X = actualOffset;
993997
_scrollData._offset.X = actualOffset;
@@ -1010,13 +1014,14 @@ private void OnAnchorOperation(bool isAnchorOperationPending)
10101014

10111015
actualOffset = _scrollData._computedOffset.Y + actualDistanceBetweenViewports;
10121016
expectedOffset = _scrollData._computedOffset.Y + _scrollData._expectedDistanceBetweenViewports;
1017+
maxOffset = _scrollData._extent.Height - _scrollData._viewport.Height;
10131018

1014-
if (DoubleUtil.LessThan(expectedOffset, 0) || DoubleUtil.GreaterThan(expectedOffset, _scrollData._extent.Height - _scrollData._viewport.Height))
1019+
if (LayoutDoubleUtil.LessThan(expectedOffset, 0) || LayoutDoubleUtil.LessThan(maxOffset, expectedOffset))
10151020
{
10161021
// the condition can fail due to estimated sizes in subtrees that contribute
10171022
// to FindScrollOffset(_scrollData._firstContainerInViewport) but not to
10181023
// _scrollData._extent. If that happens, remeasure.
1019-
if (DoubleUtil.AreClose(actualOffset, 0) || DoubleUtil.AreClose(actualOffset, _scrollData._extent.Height - _scrollData._viewport.Height))
1024+
if (LayoutDoubleUtil.AreClose(actualOffset, 0) || LayoutDoubleUtil.AreClose(actualOffset, maxOffset))
10201025
{
10211026
_scrollData._computedOffset.Y = actualOffset;
10221027
_scrollData._offset.Y = actualOffset;
@@ -2824,11 +2829,11 @@ private Size MeasureOverrideImpl(Size constraint,
28242829
ref scrollGeneration);
28252830

28262831
if (ItemsChangedDuringMeasure)
2827-
{
2828-
// if the Items collection changed, our state is now invalid. Start over.
2829-
remeasure = true;
2830-
goto EscapeMeasure;
2831-
}
2832+
{
2833+
// if the Items collection changed, our state is now invalid. Start over.
2834+
remeasure = true;
2835+
goto EscapeMeasure;
2836+
}
28322837
}
28332838
}
28342839

@@ -2873,11 +2878,11 @@ private Size MeasureOverrideImpl(Size constraint,
28732878
ref scrollGeneration);
28742879

28752880
if (ItemsChangedDuringMeasure)
2876-
{
2877-
// if the Items collection changed, our state is now invalid. Start over.
2878-
remeasure = true;
2879-
goto EscapeMeasure;
2880-
}
2881+
{
2882+
// if the Items collection changed, our state is now invalid. Start over.
2883+
remeasure = true;
2884+
goto EscapeMeasure;
2885+
}
28812886
}
28822887
}
28832888

@@ -12321,6 +12326,12 @@ private void IdentifyTrace(ItemsControl ic, VirtualizingStackPanel vsp)
1232112326
"ScrollUnit:", VirtualizingPanel.GetScrollUnit(ic),
1232212327
"CacheLen:", VirtualizingPanel.GetCacheLength(ic), VirtualizingPanel.GetCacheLengthUnit(ic));
1232312328

12329+
DpiScale dpiScale = vsp.GetDpi();
12330+
AddTrace(null, ScrollTraceOp.ID, _nullInfo,
12331+
"DPIScale:", dpiScale.DpiScaleX, dpiScale.DpiScaleY,
12332+
"UseLayoutRounding:", vsp.UseLayoutRounding,
12333+
"Rounding Quantum:", 1.0/dpiScale.DpiScaleY);
12334+
1232412335
AddTrace(null, ScrollTraceOp.ID, _nullInfo,
1232512336
"CanContentScroll:", ScrollViewer.GetCanContentScroll(ic),
1232612337
"IsDeferredScrolling:", ScrollViewer.GetIsDeferredScrollingEnabled(ic),

0 commit comments

Comments
 (0)