Доступ к свойствам формы из UserControls

#visual-studio #winforms #user-controls

#visual-студия #winforms — формы #пользовательские элементы управления

Вопрос:

Есть ли способ получить доступ к основным свойствам формы, таким как (Непрозрачность, верхний край, задний цвет и т.д.)
, С помощью кнопки в пользовательском элементе управления

я пробовал это, но ничего не вышло

 private void button1_Click(object sender, EventArgs e)
    {
        Form1 frm1 = new Form1();
        frm1.TopMost = true;
        frm1.Opacity = 50 %;
    }
 

Комментарии:

1. UserControl. Родительская форма или элемент управления. FindForm() (то же самое) или Control . TopLevelControl (надежный). — Когда вы делаете это: Form1 frm1 = new Form1(); вы создаете новый экземпляр формы, который не имеет ничего общего с экземпляром формы, в которой размещен ваш UC.

2. Очевидно, что это возможно, учитывая комментарии и ответы на данный момент. В целом, однако, это плохой дизайн для дочернего элемента управления, чтобы напрямую изменять его родительский элемент. Вместо этого попросите UserControl вызвать пользовательское СОБЫТИЕ, на которое подписывается родительская форма. При получении события родительская форма может обновиться. Теоретически это делает UserControl более удобным для повторного использования, поскольку его можно использовать в другой форме без каких-либо изменений.

Ответ №1:

Вы можете использовать приложение.Массив OpenForm для доступа к любой открытой форме:

 Application.OpenForms[0].Text = "Hello";
 

или, лучший способ:

 public static T GetForm<T>()
{
    foreach(object f in Application.OpenForms)
    {
        if (f is T) return (T) f;
    }
    return default(T);
}
 

Пример доступа к Form1 с помощью этого метода:

 GetForm<Form1>().Text = "Hello";
 

Ответ №2:

Вы можете вызвать Control.FindForm Method , чтобы получить форму, в которой находится элемент управления.

И обычно для назначения используются десятичные дроби между 0-1 Opacity .

 private void btnInUserControl_Click(object sender, EventArgs e)
{
    Form1 form1 = this.FindForm() as Form1;
    form1.Opacity = .5;
    form1.TopMost = true;
}