From cded587523e7709cc9bb994a248e077494a200f5 Mon Sep 17 00:00:00 2001 From: Abinesh p <120440951+abineshPalanisamy@users.noreply.github.com> Date: Wed, 10 Jun 2026 09:41:59 +0530 Subject: [PATCH 1/2] Added the fix for the Fix_Issue_3614 Added the fix for the Fix_Issue_3614 --- .../System/Windows/Forms/Scrolling/ScrollableControl.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/System.Windows.Forms/System/Windows/Forms/Scrolling/ScrollableControl.cs b/src/System.Windows.Forms/System/Windows/Forms/Scrolling/ScrollableControl.cs index 8a8174fd7fe..2413f6a011b 100644 --- a/src/System.Windows.Forms/System/Windows/Forms/Scrolling/ScrollableControl.cs +++ b/src/System.Windows.Forms/System/Windows/Forms/Scrolling/ScrollableControl.cs @@ -727,6 +727,7 @@ internal void SetDisplayFromScrollProps(int x, int y) Rectangle display = GetDisplayRectInternal(); ApplyScrollbarChanges(display); SetDisplayRectLocation(x, y); + SyncScrollbars(true); } /// From 242aa1e19ac25715afc095b069d6921bf8c07898 Mon Sep 17 00:00:00 2001 From: Abinesh p <120440951+abineshPalanisamy@users.noreply.github.com> Date: Thu, 18 Jun 2026 17:21:09 +0530 Subject: [PATCH 2/2] Added the unit test cases for Fix_Issue_3614 Added the unit test cases for Fix_Issue_3614 --- .../Windows/Forms/ScrollableControlTests.cs | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/test/unit/System.Windows.Forms/System/Windows/Forms/ScrollableControlTests.cs b/src/test/unit/System.Windows.Forms/System/Windows/Forms/ScrollableControlTests.cs index f8efb0e98c5..daca824f958 100644 --- a/src/test/unit/System.Windows.Forms/System/Windows/Forms/ScrollableControlTests.cs +++ b/src/test/unit/System.Windows.Forms/System/Windows/Forms/ScrollableControlTests.cs @@ -2547,6 +2547,73 @@ public void ScrollableControl_ScrollControlIntoView_Invoke_Success(bool autoScro control.Controls.Clear(); } + [WinFormsFact] + public unsafe void ScrollableControl_SetDisplayFromScrollProps_InvokeHorizontalOffset_SyncsManagedAndNativeScrollPositions() + { + using SubScrollableControl control = CreateScrollableControlWithHorizontalOverflow(); + + Assert.True(control.IsHandleCreated); + Assert.True(control.HorizontalScroll.Visible); + Assert.Equal(0, control.DisplayRectangle.X); + Assert.Equal(0, control.HorizontalScroll.Value); + Assert.Equal(0, GetNativeHorizontalScrollPosition(control)); + + control.SetDisplayFromScrollPropsPublic(-120, 0); + + Assert.Equal(-120, control.DisplayRectangle.X); + Assert.Equal(120, control.HorizontalScroll.Value); + Assert.Equal(120, GetNativeHorizontalScrollPosition(control)); + } + + [WinFormsFact] + public unsafe void ScrollableControl_SetDisplayFromScrollProps_InvokeRepeatedHorizontalOffsets_SyncsOnEachUpdate() + { + using SubScrollableControl control = CreateScrollableControlWithHorizontalOverflow(); + + control.SetDisplayFromScrollPropsPublic(-160, 0); + + Assert.Equal(-160, control.DisplayRectangle.X); + Assert.Equal(160, control.HorizontalScroll.Value); + Assert.Equal(160, GetNativeHorizontalScrollPosition(control)); + + control.SetDisplayFromScrollPropsPublic(-40, 0); + + Assert.Equal(-40, control.DisplayRectangle.X); + Assert.Equal(40, control.HorizontalScroll.Value); + Assert.Equal(40, GetNativeHorizontalScrollPosition(control)); + } + + private static unsafe int GetNativeHorizontalScrollPosition(ScrollableControl control) + { + SCROLLINFO info = new() + { + cbSize = (uint)sizeof(SCROLLINFO), + fMask = SCROLLINFO_MASK.SIF_POS + }; + + PInvoke.GetScrollInfo(control, SCROLLBAR_CONSTANTS.SB_HORZ, ref info); + return info.nPos; + } + + private static SubScrollableControl CreateScrollableControlWithHorizontalOverflow() + { + SubScrollableControl control = new() + { + AutoScroll = true, + Size = new Size(200, 200) + }; + + control.Controls.Add(new Button + { + Bounds = new Rectangle(900, 0, 100, 30) + }); + + control.CreateControl(); + control.PerformLayout(); + + return control; + } + private class LargeControl : Control { protected override Size DefaultSize => new(100, 150); @@ -2662,5 +2729,7 @@ public class SubScrollableControl : ScrollableControl public new void SetScrollState(int bit, bool value) => base.SetScrollState(bit, value); public new void SetStyle(ControlStyles flag, bool value) => base.SetStyle(flag, value); + + public void SetDisplayFromScrollPropsPublic(int x, int y) => SetDisplayFromScrollProps(x, y); } }