1

ユーザーがオプション ウィンドウで言語を変更した後、UI 文字列を変更すると問題が発生します。メイン フォームの UI 文字列を変更するには、変更を有効にするために毎回プログラムを再起動する必要がありますが、面倒です。そこで、新しい設定を保存した後、メイン ウィンドウの文字列をオプション ウィンドウにロードする関数をデリゲートで呼び出してみました。この関数はオプション ウィンドウで呼び出されますが、メイン ウィンドウの文字列は変更されません。

メイン ウィンドウのコード

public delegate void CallLoadUIStrings(SupportedLanguages lang);
public CallLoadUIStrings callLoadUIStrings;

public Renamer()
{
     callLoadUIStrings = new CallLoadUIStrings(LoadUIStrings);
}

 public void LoadUIStrings(SupportedLanguages lang)
 {
       try
       {
            switch (lang)
            {
                    #region "DE/JA/FR/ES/NL"
                    case SupportedLanguages.De:
                    case SupportedLanguages.Ja:
                    case SupportedLanguages.Fr:
                    case SupportedLanguages.Es:
                    case SupportedLanguages.Nl:
                         // reads the language file where the ui strings are stored
                        langHelper.Read(RenamerLangOpener.RenamerMainWindow);

                        this.mnuFile.Text = langHelper.Files;
                        this.mnuClose.Text = langHelper.Close;

                        this.mnuEdit.Text = langHelper.Edit;
                        this.mnuUndo.Text = langHelper.Undo;
                        this.mnuCut.Text = langHelper.Cut;
                        this.mnuCopy.Text = langHelper.Copy;
                        this.mnuPaste.Text = langHelper.Paste;
                        this.mnuDelete.Text = langHelper.Delete;
                        this.mnuSelectAll.Text = langHelper.SelectAll;
                     #endregion
            }
       }
       catch (Exception ex) { //exception handling }
}
private void mnuOpt_Click(object sender, EventArgs e)
{
       Preferences opt = new Preferences(this);
       opt.ShowDialog();
} 

オプション ウィンドウのコード

    internal Renamer instance = null;
    public Preferences(Renamer form)
    {
        instance = form;
    }
    public void UpdateUI()
    {
        langHelper.ReadSettingsValues();
        instance.BeginInvoke(instance.callLoadUIStrings,new object[] { langHelper.GetLang});
    }

私はデリゲートと一緒に仕事をしたことがないので、どこが間違っているのかわかりません。同様の問題の解決策を見つけるためにグーグルで検索しましたが、私の問題に一致するものは見つかりませんでした。

4

1 に答える 1

0

これは WPF の質問ではなく winforms であり、アプリの Main 関数から開いているメイン フォームが 1 つあると仮定します。言語を変更するための私の解決策は、この 1 つのフォームをループで開き、フォームのプロパティが何らかの言語識別子に設定されている限りループを続けることです。このプロパティが設定されている場合は、言語をその値に変更し、別のループ反復に進みます。あるフォームから別のフォームにコピーする必要がある他のすべてのプロパティをコピーします。メインはフォームの位置です。

言語 ID が設定されていない状態でフォームが閉じられた場合、ループを中断し、通常どおりアプリケーションを終了します。

于 2012-10-01T20:37:33.997 に答える