将一个值传输到另一个 class,更改它并将其返回到主 class

Transferring a value to another class, changing it and returning it back to the main class

有 2 个 class 和 Beauty_VScrollBar.csRTB.cs。 来自class元素的名称,转换为RichTextBox,被传递。 second class 将事件处理程序绑定到接收到的名称,执行计算并将值写入变量 Maximum。结果值传回 first class.

问题:该值只计算一次。当您尝试更改组件的尺寸(内部或外部)时,不会再次进行计算。

Beauty_VScrollBar.cs

private Control bindingContainer;
public Control BindingContainer {
    get { return bindingContainer; }
    set {
        bindingContainer = value;
        Updates(); Invalidate();
    }
}

private void Updates() {
    if (bindingContainer is RichTextBox) {
        RTB.Name = (RichTextBox)bindingContainer;
        RTB.BindEventHandlers(); Maximum = RTB.Maximum;
    } else if (bindingContainer is Panel) {
        PNL.Name = (Panel)bindingContainer;
        PNL.BindEventHandlers(); Maximum = PNL.Maximum;
    } else {
        bindingContainer = null;
        MessageBox.Show("The selected item is not a RichTextBox");
    }
}

RTB.cs

public static class RTB {
    public static RichTextBox Name { get; set; }
    public static int Maximum { get; private set; }

    private static int heightContentRtb;
    private static int heightContainerRtb;

    public static void BindEventHandlers() {
        Name.Resize += (s, e) => SetMaxVScroll();

        Name.ContentsResized += (s, e) => {
            heightContentRtb = e.NewRectangle.Height; SetMaxVScroll();
        };
    }

    private static void SetMaxVScroll() {
        heightContainerRtb = Name.ClientSize.Height;
        Maximum = Math.Abs(heightContentRtb - heightContainerRtb + 1);
    }
}

如果你把所有的事情都做成一个class - 一切正常,但不方便更新。

注意:除了RichTextBox,还会用到其他类型,所以我们需要进行转换(... as RichTextBox)。

private RichTextBox targetCtrl;
public RichTextBox TargetCtrl {
    get { return targetCtrl; }
    set {
        targetCtrl = value;
        Updates(); Invalidate();
    }
}

private void Updates() {
    if (targetCtrl != null) targetCtrl.Resize += TargetCtrl_Resize;
    if (targetCtrl != null) targetCtrl.ContentsResized += TargetCtrl_ContentsResized;
}

int heightContentRtb;

private void TargetCtrl_Resize(object sender, EventArgs e) {
    SetMaxVScroll();
}

private void TargetCtrl_ContentsResized(object sender, ContentsResizedEventArgs e) {
    heightContentRtb = e.NewRectangle.Height; SetMaxVScroll();
}

private void SetMaxVScroll() {
    int heightContainerRtb = targetCtrl.ClientSize.Height;
    Maximum = Math.Abs(heightContentRtb - heightContainerRtb + 1);
}

如果您为多个控件重复使用 RTB,那么您每次都会破坏(覆盖)Name 的值。事件处理程序仍然注册到每个事件处理程序,但是当事件处理程序运行时,它处于 Name 当前值的上下文中,因为 Namestatic.

如果您不喜欢您列出的第二个版本并希望您的代码更紧密地结合在一起,您可以创建一个闭包来处理事件分配和 Maximum 计算。每次调用时,闭包都会保持单独的状态。但是你的第二个版本对我来说还不错。

pubilc void setup(RichTextBox name){
     int heightContentRtb = 0;
     int heightContainerRtb = 0;

     void SetMaxVScroll() {
        heightContainerRtb = Name.ClientSize.Height;
        Maximum = Math.Abs(heightContentRtb - heightContainerRtb + 1);
    }

    name.Resize += (s, e) => SetMaxVScroll();
    Name.ContentsResized += (s, e) => {
        heightContentRtb = e.NewRectangle.Height;
        SetMaxVScroll();
    };
}

注意: 我不清楚 Maximum 的目的是什么或它应该放在哪里。在上面的代码中,每次调整特定 RichTextBox 控件的大小时它都会被覆盖。