C # — изменить текст метки в открытой форме из другого класса

#c# #forms #call #invoke

#c# #формы #позвоните #вызвать

Вопрос:

Я кодирую программу на C # с использованием WinForms, которая имеет языковую поддержку, что означает, что пользователь может, например, изменить язык программы с английского на немецкий.

Теперь у меня есть Form1 с Label1 и а Class1 .

Class1 имеет открытый метод void с именем Translate() , и он должен перевести текст Label1 . Он делает это, выполняя Translate() при Form1 событии загрузки, но это не работает для меня.

Я попробовал это со следующим кодом в Form1 :

  private void Form1_Load(object sender, EventArgs e)
    {
        new Class1(Translate());
    }
 

Код в Class1 :

  public void Translate()
    {
        if (Language.Equals(1))
        {
            new Form1().Label1.Text = "English Translated Text";
        }
        else if(Language.Equals(2))
        {
            new Form1().Label1.Text = "German Translated Text";
        }
    }
 

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

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

1. Во-первых, это неправильный подход. Но, если вы хотите, чтобы это изменилось таким образом, передайте экземпляр form1 методу Translate . Вы можете использовать «это», чтобы получить текущую форму. Прочитайте здесь и в других местах текст, касающийся локализации в приложениях WinForms. Вы получите больше информации о том, как это должно работать. Если вы хотите, чтобы это решение работало — прочитайте о передаче экземпляра формы…

2. Зачем просто использовать ваш Form1 для написания этих кодов вместо использования отдельного класса?

Ответ №1:

Как и предлагалось, передайте форму через this :

 private void Form1_Load(object sender, EventArgs e)
{
    Class1 c1 = new Class1();
    c1.Translate(this));
}
 

В Translate() :

 public void Translate(Form1 f1)
{
    if (Language.Equals(1))
    {
        f1.Label1.Text = "English Translated Text";
    }
    else if(Language.Equals(2))
    {
        f1.Label1.Text = "German Translated Text";
    }
}
 

* Это предполагает, однако, что Label1 это общедоступно в Form1. Элементы управления по умолчанию недоступны для общественности. Чтобы исправить это, измените Modifiers свойство Label на public .

Но реальное решение заключается в реализации локализации.