2015-06-08 1 views
0

У меня возникли проблемы с этим, Я пытаюсь достичь: У меня есть основная форма, является формой запуска (MDI Container) , а затем несколькими формами, которые являются дочерними формами, чего я пытаюсь достичь, является следующее: это код, который происходит на каждом экране на данный момент, и я хочу построить его в класс, но, я не знаю, как передать это (за клик события происходят на каждой форме в данный момент, и я хочу, чтобы запустить из меню нажмите на родительском MDI (контейнер) :Передача Это (моей основной формы) классу, который обрабатывает изменение направления и изменение языка C#/Winforms

UPDATE

Я получил его на работу со всеми ChildForms Thanx @JamesBarras это как мой код работает сейчас, я должен удалить нажатие кнопки события, ибо только работает с MenuStripItem_Click событие

#region Change Language 
    private void englishToolStripMenuItem_Click(object sender, EventArgs e) { 
    Class1 cls = new Class1(); 
    /// This is for Main and all the forms of MainForms Children 
    foreach (var childForm in this.MdiChildren) { 
     cls.ChangeLanguage(sender, log, childForm, this, this.menuStrip, "en"); 
     //ChangeLanguage("en", childForm); 
    } 
    } 

    private void arabicToolStripMenuItem_Click(object sender, EventArgs e) { 
    Class1 cls = new Class1(); 
    /// This is for Main and all the forms of MainForms Children 
    foreach (var childForm in this.MdiChildren) { 
     cls.ChangeLanguage(sender, log, childForm, this, this.menuStrip, "ar"); 
     //ChangeLanguage("ar", childForm); 
    } 
    } 
    #endregion 

Я только что создал этот класс, как этот код работает на той же странице, щелкните событие как метод, я хочу, класс, который я использую/созданный (ChangeLangu возраст), чтобы знать, что это есть, потому что в нормальной форме, я могу сказать это, но в классе он не знает, что это на форме, что у меня есть мой нажмите событие, вот мой код в классе, который я создал:

UPDATE

Я прекрасно настроил класс, чтобы сделать EXA ctly то, что мне нужно это сделать, но, я до сих пор не могут перевести MenuStripItems и я получаю значениеэто, но до сих пор нет MenuStrip Перевести только переключатель направления работы

namespace languageChange.Classes { class Class1 { 

    #region Methods 
    /// <summary> 
    /// This is mainly to change the language and the layout direction 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="log"></param> 
    /// <param name="form"></param> 
    /// <param name="thiss"></param> 
    /// <param name="strip"></param> 
    /// <param name="lang"></param> 
    public void ChangeLanguage(object sender, Logger log, Form form, Form thiss, Control strip, string lang) { 
    string senderText = sender.GetType().ToString(); 

     RightToLeft direction = RightToLeft.No; 
    if (lang == "ar") { 
     direction = RightToLeft.Yes; 
    } 
    thiss.RightToLeft = direction; 

    CultureInfo CurrentLocale = new CultureInfo(lang); 
    Thread.CurrentThread.CurrentCulture = new CultureInfo(lang); 
    Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang); 
    foreach (Control childForm in form.Controls) { 
     ComponentResourceManager resources = new ComponentResourceManager(form.GetType()); 
     resources.ApplyResources(childForm, "$this"); 
     childForm.RightToLeft = direction; 
     if (log.isDebugEnabled) log.Debug("--------------------------------------> c = " + childForm.Name); 
     RefreshResources(log, lang, childForm, resources, CurrentLocale, strip); 
    } 
    } 
    /// <summary> 
    /// This is to for the Refresh all the Resources 
    /// </summary> 
    /// <param name="log"></param> 
    /// <param name="lang"></param> 
    /// <param name="ctrl"></param> 
    /// <param name="resources"></param> 
    /// <param name="CurrentLocale"></param> 
    /// <param name="strip"></param> 
    private static void RefreshResources(Logger log, string lang, Control ctrl, ComponentResourceManager resources, CultureInfo CurrentLocale, Control strip) { 
    ctrl.SuspendLayout(); 
    resources.ApplyResources(ctrl, ctrl.Name, CurrentLocale); 
    foreach (Control control in ctrl.Controls) { 
     RefreshResources(log, lang, control, resources, CurrentLocale, strip); // recursion 
     if (strip is ToolStrip) { 
      RefreshResources(((ToolStrip)strip).Items, resources, CurrentLocale); 
     } 
     ctrl.ResumeLayout(true); 
     if (log.isTraceEnabled) log.Trace("c=" + ctrl.Name); 
    } 
    } 
    /// <summary> 
    /// Which is done here [Refer to previous Summary] 
    /// </summary> 
    /// <param name="col"></param> 
    /// <param name="resources"></param> 
    /// <param name="CurrentLocale"></param> 
    private static void RefreshResources(ToolStripItemCollection col, ComponentResourceManager resources, CultureInfo CurrentLocale) { 
    foreach (ToolStripMenuItem item in col) { 
     if (item is ToolStripMenuItem) {    
      RefreshResources(((ToolStripMenuItem)item).DropDownItems, resources, CurrentLocale); 
     } 
     resources.ApplyResources(item, item.Name, CurrentLocale); 
    } 
    } 
    #endregion }} 

UPDATE

так я получил все, чтобы перевести и изменить направление для MenuStripItems и MenuStrip, а также за исключением.

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

Это приложение Winforms с использованием Visual Studio 2013 Ultimate с C#.

Не против регистратора, это то, что я просто добавил для входа трассировки и отладчик

ответ

1

Изменить подпись ChangeLanguage(string lang) к ChangeLanguage(Form form, string lang), так что вы можете передать его в форму, которую вы хотите изменить.

Впоследствии вам нужно будет обратиться к форме, над которой вы работаете, в качестве переданного в одном. Поэтому заменить this в этом методе с form и формы типа typeof(Form1) с form.GetType()

Везде вы хотите изменить язык на любом для вас теперь можно назвать

Class1.ChangeLanguage(this, "en"); 

где this является текущая форма

Для измените язык для MDIParent, вам нужно будет:

private void englishToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
    Class1.ChangeLanguage(log, this, "en"); 
    foreach(var child in this.MdiChildren) 
    { 
     Class1.ChangeLanguage(log, child, "en"); 
    } 
    } 

Обратите внимание, что изменить язык самих вам нужно добавить перегрузку RefreshResources, чтобы справиться с ToolStripItemCollections MenuStrip (они являются компонентом на основе не контролирует основу)

private static void RefreshResources(ToolStripItemCollection col, ComponentResourceManager resources, CultureInfo CurrentLocale) 
    { 
     foreach(ToolStripItem item in col) 
     { 
      if (item is ToolStripMenuItem) 
      { 
       RefreshResources(((ToolStripMenuItem)item).DropDownItems, resources, CurrentLocale); 
      } 
      resources.ApplyResources(item, item.Name, CurrentLocale); 
     } 
    } 

и добавьте следующий код в исходном RefreshResources

if (ctrl is ToolStrip) 
    { 
     RefreshResources(((ToolStrip)ctrl).Items, resources, CurrentLocale); 
    } 
+0

Комментарии для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackoverflow.com/rooms/80293/discussion-on-answer-by-james-barrass-passing-thisof-my-main-form-to-a- класс-т). – Taryn

Смежные вопросы