0

我正在尝试通过构建 Windows 窗体来学习 C#,但我遇到了一些我无法找到搜索答案的东西。我的搜索结果可能已经为我提供了答案(这是不可能的),但我想在放弃之前确认一下。

我正在创建一个具有多个面板和/或 FlowLayoutPanel 的表单,每个面板都有多个控件。我正在尝试动态计算控件占用的空间量,以便可以将 Padding 添加到 Panel/FlowLayoutPanel 以使控件居中。使用 Anchors 可能有更好的方法来做到这一点,但我正在学习,这是我能想到的解决这个特定问题以帮助我学习的最佳方法。

当我解决了这个问题时,我意识到 Padding 结构没有一个构造函数,它可以让我在其他应用程序(特别是 Microsoft Office 和 VBA)中看到的事情变得更容易。我希望能够创建一个new Padding()具有构造函数的构造函数,该构造函数接受(int Horizontal, int Vertical)或仅(int Horizontal)或仅(int Vertical)将“水平” int 复制到控件的 .Left 和 .Right 属性的位置,并将“垂直” int 复制到 .Top和 .Bottom 控件的属性。

所以,我的问题是:有没有办法为现有的类/结构编写构造函数,或者以某种方式重载 Padding 结构,让我只用两个值而不是全部四个值来获得我想要的填充?

谢谢...

4

1 回答 1

2

您可以从现有类派生新类,前提是现有类不是sealed. 但是在您的情况下,该类实际上是 a struct,并且您不能从结构派生。

通过扩展方法,您可以向现有类添加类似实例的方法,但不能向现有类添加静态方法或构造函数。

当我处于这种情况时,我只是创建一个新的静态实用程序类来做我想做的事。例如:

public static class PaddingUtil
{
    public static Padding FromHV(int horizontal, int vertical)
    {
        return new Padding(horizontal, vertical, horizontal, vertical);
    }
}

并像这样使用它:

Padding p = PaddingUtil.FromHV(10, 20);

您的问题表明您不了解 C# 的基础知识。我建议你买一本关于 C# 的书并阅读它。

但现在要帮助你:

  • 要将值分配给对象的字段或属性,只需执行以下操作:

    Padding p = PaddingUtil.FromHV(10, 20);
    myControl.Padding = p;
    

    或等效地:

    myControl.Padding = PaddingUtil.FromHV(10, 20);
    
  • 要获取对象的字段或属性的当前值,只需执行以下操作:

    Padding p = myControl.Padding;
    
  • 要更改Padding结构上的某些属性:

    Padding oldPadding = myControl.Padding;
    Padding newPadding = new Padding(
        10, // Left
        oldPadding.Top,
        10, // Right
        oldPadding.Bottom);
    myControl.Padding = newPadding;
    

你可以把最后一个例子变成一个扩展方法。谷歌它,或搜索堆栈溢出。

于 2013-05-14T23:55:11.740 回答