dotnet/winforms
Vedi su GitHubScrollableControl.ScaleDockPadding seems to be broken?
Open
#2841 aperta il 10 feb 2020
design-discussionhelp wanted
Metriche repository
- Star
- (4100 star)
- Metriche merge PR
- (Merge medio 14g 22h) (56 PR mergiate in 30 g)
Descrizione
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);
}