Skip to content

ScrollableControl.ScaleDockPadding seems to be broken? #2841

@hughbe

Description

@hughbe

Problem:

Looking at the implementation of `ScrollableControl.Scale{Core}:

internal void ScaleDockPadding(float dx, float dy)
{
    dockPadding?.Scale(dx, dy);
}

[EditorBrowsable(EditorBrowsableState.Never)]
protected override void ScaleCore(float dx, float dy)
{
    ScaleDockPadding(dx, dy);
    base.ScaleCore(dx, dy);
}

Where DockPadding.Scale is implemented as

internal void Scale(float dx, float dy) => _owner.Padding.Scale(dx, dy);

I would expect the scrollable control's padding to scale by dx and dy. However, the following tests demonstrate that no scaling is happening.

I think something may be weird in that calling Padding.Scale does not seem to affect the underlying Padding instance stored in Control

[WinFormsFact]
public void ScrollableControl_Scale_InvokeWithoutPaddingWithDockPadding_Success()
{
    using var control = new ScrollableControl();
    Assert.Equal(0, control.DockPadding.Left);
    Assert.Equal(0, control.DockPadding.Top);
    Assert.Equal(0, control.DockPadding.Right);
    Assert.Equal(0, control.DockPadding.Bottom);
    control.Scale(10, 20);

    Assert.Equal(0, control.DockPadding.Left);
    Assert.Equal(0, control.DockPadding.Top);
    Assert.Equal(0, control.DockPadding.Right);
    Assert.Equal(0, control.DockPadding.Bottom);
    Assert.Equal(Padding.Empty, control.Padding);
}

[WinFormsFact]
public void ScrollableControl_Scale_InvokeWithoutPaddingWithoutDockPadding_Success()
{
    using var control = new ScrollableControl();
    control.Scale(10, 20);
    Assert.Equal(0, control.DockPadding.Left);
    Assert.Equal(0, control.DockPadding.Top);
    Assert.Equal(0, control.DockPadding.Right);
    Assert.Equal(0, control.DockPadding.Bottom);
    Assert.Equal(Padding.Empty, control.Padding);
}

[WinFormsFact]
public void ScrollableControl_Scale_InvokeWithPaddingWithDockPadding_Success()
{
    using var control = new ScrollableControl
    {
        Padding = new Padding(1, 2, 3, 4)
    };
    control.Scale(10, 20);
    Assert.Equal(1, control.DockPadding.Left);
    Assert.Equal(2, control.DockPadding.Top);
    Assert.Equal(3, control.DockPadding.Right);
    Assert.Equal(4, control.DockPadding.Bottom);
    Assert.Equal(new Padding(1, 2, 3, 4), control.Padding);
}

[WinFormsFact]
public void ScrollableControl_Scale_InvokeWithPaddingWithoutDockPadding_Success()
{
    using var control = new ScrollableControl
    {
        Padding = new Padding(1, 2, 3, 4)
    };
    Assert.Equal(1, control.DockPadding.Left);
    Assert.Equal(2, control.DockPadding.Top);
    Assert.Equal(3, control.DockPadding.Right);
    Assert.Equal(4, control.DockPadding.Bottom);
    control.Scale(10, 20);
    Assert.Equal(1, control.DockPadding.Left);
    Assert.Equal(2, control.DockPadding.Top);
    Assert.Equal(3, control.DockPadding.Right);
    Assert.Equal(4, control.DockPadding.Bottom);
    Assert.Equal(new Padding(1, 2, 3, 4), control.Padding);
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    design-discussionOngoing discussion about design without consensushelp wantedGood issue for external contributors

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions