Skip to content

Commit ceba136

Browse files
committed
fix(scrollbar): Fix possible layout cycle when scrollbar is lower than the min size of the thumb
1 parent 540617f commit ceba136

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

src/Uno.UI/UI/Xaml/Controls/ScrollBar/ScrollBar.cs

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,13 @@ void UpdateIndicatorLengths(
11461146
pMouseIndicatorLength = 0.0;
11471147
pTouchIndicatorLength = 0.0;
11481148

1149+
// Uno workaround: If the scrollbar is smaller than the min size of the thumb,
1150+
// we will try to set the visibility collapsed and then request to 'HideThumb',
1151+
// which will drive uno to fall in an infinite layout cycle.
1152+
// We instead cache the value and apply it only at the end.
1153+
double? m_tpElementHorizontalThumbWidth = default, m_tpElementVerticalThumbHeight = default, m_tpElementHorizontalPanningThumbWidth = default, m_tpElementVerticalPanningThumbHeight = default;
1154+
Visibility? m_tpElementHorizontalThumbVisibility = default, m_tpElementVerticalThumbVisibility = default, m_tpElementHorizontalPanningThumbVisibility = default, m_tpElementVerticalPanningThumbVisibility = default;
1155+
11491156
if (!hideThumb)
11501157
{
11511158
double minSize = 0.0;
@@ -1159,8 +1166,9 @@ void UpdateIndicatorLengths(
11591166

11601167
double actualSize;
11611168
double actualSizeMinusRepeatButtonsLength;
1169+
11621170
if (orientation == Orientation.Horizontal &&
1163-
m_tpElementHorizontalThumb != null)
1171+
m_tpElementHorizontalThumb != null)
11641172
{
11651173
if (maximum - minimum != 0)
11661174
{
@@ -1177,8 +1185,8 @@ void UpdateIndicatorLengths(
11771185
}
11781186
else
11791187
{
1180-
m_tpElementHorizontalThumb.Visibility = Visibility.Visible;
1181-
m_tpElementHorizontalThumb.Width = result;
1188+
m_tpElementHorizontalThumbVisibility = Visibility.Visible;
1189+
m_tpElementHorizontalThumbWidth = result;
11821190
mouseIndicatorLengthWasSet = true;
11831191
}
11841192
}
@@ -1200,8 +1208,8 @@ void UpdateIndicatorLengths(
12001208
}
12011209
else
12021210
{
1203-
m_tpElementVerticalThumb.Visibility = Visibility.Visible;
1204-
m_tpElementVerticalThumb.Height = result;
1211+
m_tpElementVerticalThumbVisibility = Visibility.Visible;
1212+
m_tpElementVerticalThumbHeight = result;
12051213
mouseIndicatorLengthWasSet = true;
12061214
}
12071215
}
@@ -1233,8 +1241,8 @@ void UpdateIndicatorLengths(
12331241
}
12341242
else
12351243
{
1236-
m_tpElementHorizontalPanningThumb.Visibility = Visibility.Visible;
1237-
m_tpElementHorizontalPanningThumb.Width = result;
1244+
m_tpElementHorizontalPanningThumbVisibility = Visibility.Visible;
1245+
m_tpElementHorizontalPanningThumbWidth = result;
12381246
touchIndicatorLengthWasSet = true;
12391247
}
12401248
}
@@ -1255,8 +1263,8 @@ void UpdateIndicatorLengths(
12551263
}
12561264
else
12571265
{
1258-
m_tpElementVerticalPanningThumb.Visibility = Visibility.Visible;
1259-
m_tpElementVerticalPanningThumb.Height = result;
1266+
m_tpElementVerticalPanningThumbVisibility = Visibility.Visible;
1267+
m_tpElementVerticalPanningThumbHeight = result;
12601268
touchIndicatorLengthWasSet = true;
12611269
}
12621270
}
@@ -1287,6 +1295,17 @@ void UpdateIndicatorLengths(
12871295
m_tpElementVerticalPanningThumb.Visibility = Visibility.Collapsed;
12881296
}
12891297
}
1298+
else
1299+
{
1300+
if (m_tpElementHorizontalThumbWidth.HasValue) m_tpElementHorizontalThumb.Width = m_tpElementHorizontalThumbWidth.Value;
1301+
if (m_tpElementVerticalThumbHeight.HasValue) m_tpElementVerticalThumb.Height = m_tpElementVerticalThumbHeight.Value;
1302+
if (m_tpElementHorizontalPanningThumbWidth.HasValue) m_tpElementHorizontalPanningThumb.Width = m_tpElementHorizontalPanningThumbWidth.Value;
1303+
if (m_tpElementVerticalPanningThumbHeight.HasValue) m_tpElementVerticalPanningThumb.Height = m_tpElementVerticalPanningThumbHeight.Value;
1304+
if (m_tpElementHorizontalThumbVisibility.HasValue) m_tpElementHorizontalThumb.Visibility = m_tpElementHorizontalThumbVisibility.Value;
1305+
if (m_tpElementVerticalThumbVisibility.HasValue) m_tpElementVerticalThumb.Visibility = m_tpElementVerticalThumbVisibility.Value;
1306+
if (m_tpElementHorizontalPanningThumbVisibility.HasValue) m_tpElementHorizontalPanningThumb.Visibility = m_tpElementHorizontalPanningThumbVisibility.Value;
1307+
if (m_tpElementVerticalPanningThumbVisibility.HasValue) m_tpElementVerticalPanningThumb.Visibility = m_tpElementVerticalPanningThumbVisibility.Value;
1308+
}
12901309
}
12911310

12921311
// during a SemanticZoomOperation we want to be able to block the scrollbar

0 commit comments

Comments
 (0)