Как вызвать метод в форме, когда изменяется свойство класса, на который есть ссылка в этой форме? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть форма, и я создал для нее новый класс. Но я не могу вызвать Invalidate() внутри класса

Мой код -

  public partial class CustomForm : Form
  {
      private bool showBorderLine;
      private Color borderLineColor;
      private int borderLineWidth;

    public CustomForm()
    {
        InitializeComponent();

        this.DoubleBuffered = true;
        this.ResizeRedraw = true;
        this.SetStyle(ControlStyles.ResizeRedraw, true);
        this.FormBorderStyle = FormBorderStyle.None;

        borderLineColor = Color.DodgerBlue;
        borderLineWidth = 1;
        showBorderLine = true;
    }

    [Category("Form Editor")]
    public bool ShowBorderLine
    {
        get { return showBorderLine; }
        set
        {
            showBorderLine = value; // Here I can able to call invalidate 
                                    // and it works perfectly
            this.Invalidate(true); 
        }
    }       

    private ResizeOptions resizeOptions = new ResizeOptions();

    [Category("Form Editor")]
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public ResizeOptions ResizeOptions
    {
        get { return resizeOptions; }
        set
        {
            resizeOptions = value;
            this.Invalidate(true); // when I call invalidate here.it won't working. I hope I need to invalidate it in the Resize option Class for work perfectly
        }
    }
}

[TypeConverter(typeof(ExpandableObjectConverter))]
public class ResizeOptions // Inside this class i cant able to use invalidate method
{
    private bool resizeTop;
    private bool resizeBottom;
    // more fields

    public ResizeOptions()
    {
        resizeTop = true;
        resizeBottom = true;
        // more fields initialized
    }

    [Category("Form Editor")]
    public bool ResizeTop
    {
        get { return resizeTop; }
        set { resizeTop = value; } // I want to call invalidate method here
    }

    [Category("Form Editor")]
    public bool ResizeBottom
    {
        get { return resizeBottom; } 
        set { resizeBottom = value; } // I want to call invalidate method here
    }

    // more of the same
}

Вы можете увидеть метод invalidateвозможно внутри класса Form, но я не могу использовать его в классе ResizeOptions

я вызываю метод invalidate для получения поддержки времени разработки для свойств.

если вы хотите, я могу предоставить полный код

пожалуйста, помогите мне.

1 Ответ

0 голосов
/ 03 июня 2019

ResizeOptions это просто класс, который содержит значения.Даже если вы используете его в связи с Form, у него нет «осознания» того, что оно используется внутри формы, и не должно.Не нужно знать, что когда его значения меняются, где-то существует форма, в которой должен быть вызван метод Invalidate().

Более того, как мы можем быть уверены, что существует форма для аннулирования?Мы могли бы сделать это:

var resizeOptions = new ResizeOptions();

Теперь формы вообще нет.Если бы мы могли как-то вызвать Invalidate() из этого класса, он бы стал недействительным?

Что он может сделать, это, когда его значения изменились, вызвать событие, которое говорит: «Здравствуйте, мои значения изменились!"и тогда другие компоненты, такие как форма, могут решить, что они должны делать с этой информацией.

Для этого вы можете создать делегата:

public delegate void ResizeOptionsChangedEventHandler(ResizeOptions sender);

Добавить событие в ResizeOptions:

public event ResizeOptionsChangedEventHandler ResizeOptionsChanged;

Поднимите его, когда вам нужно:

public bool ResizeTop
{
    get { return resizeTop; }
    set
    {
        resizeTop = value;
        ResizeOptionsChanged?.Invoke(this);
    }
}

Теперь ResizeOptions сделал свое дело, сообщив всем, кому небезразлично, что оно изменилось.То, что делает другой класс с этой информацией, зависит от этого другого класса.

Теперь в своей форме вы можете подписаться на событие в конструкторе:

public CustomForm()
{
    // other constructor stuff
    resizeOptions.ResizeOptionsChanged += ResizeOptions_ResizeOptionsChanged;
}

ив свойстве:

public ResizeOptions ResizeOptions
{
    get { return resizeOptions; }
    set
    {
        if (resizeOptions != null)
            resizeOptions.ResizeOptionsChanged -= ResizeOptions_ResizeOptionsChanged;
        resizeOptions = value;
        resizeOptions.ResizeOptionsChanged += ResizeOptions_ResizeOptionsChanged;
        this.Invalidate(true);
    }
}

с помощью этого обработчика события:

private void ResizeOptions_ResizeOptionsChanged(ResizeOptions sender)
{
    Invalidate(true);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...