0

.NET 3.5 を使用するアプリケーションにローカリゼーションを追加する作業を行っています。アプリケーションは、MVVM パターンとコマンドを使用してカルチャを変更しています。DatePicker コントロールは、クリックするまで言語を変更しないことを除いて、すべて正常に機能しています。この時点で、選択した日付テキストが適切に変更されます。コントロールのドロップダウン カレンダーも、月を前後に一度移動するまで言語を変更しません。

コマンドを実行してカルチャを変更するとすぐに、コントロールを強制的に適切な言語で更新するにはどうすればよいですか?

私はいくつかのことを試しましたが、成功しませんでした:

  • DatePickerControl.InvalidateVisual()
  • DatePickerControl.UpdateLayout()
  • VM の SelectedDate の CultureChanged イベントで NotifyPropertyChanged を起動する
  • DatePickerControl.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate)

App.xaml.cs

protected override void OnStartup(StartupEventArgs e)
    {
        ApplicationCulture.Instance.CultureChanged += Instance_CultureChanged;
        base.OnStartup(e);
    }

    private void Instance_CultureChanged(object sender, CultureChangedEventArgs e)
    {
        System.Threading.Thread.CurrentThread.CurrentUICulture = e.Culture;
        System.Threading.Thread.CurrentThread.CurrentCulture = e.Culture;
    }

意見

<UserControl x:Class="ManageAppointmentsView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:toolkit="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit">
<StackPanel>
    <TextBlock Margin="5" FontSize="15" Text="{Binding LocalizedResources.Resource.Date}" />

    <toolkit:DatePicker SelectedDate="{Binding SelectedDate}" SelectedDateFormat="Long" FontSize="15" VerticalContentAlignment="Center" 
                                DisplayDateStart="{Binding StartDate}" CalendarStyle="{StaticResource CalendarStyle}" x:Name="DatePickerControl" />
</StackPanel>
</UserControl>

ViewModel コマンド

ChangeLanguageCommand = new SimpleCommand
                                    {
                                        ExecuteDelegate = x =>
                                                              {
                                                                  var newCulture = x == null
                                                                                       ? "en-US"
                                                                                       : x.ToString();

                                                                  ApplicationCulture.Instance.CurrentCulture =
                                                                      new CultureInfo(newCulture);
                                                              }
                                    };

アプリケーション文化

public class ApplicationCulture : INotifyCultureChanged
{
    private ApplicationCulture() { }

    private static ApplicationCulture _instance;
    public static ApplicationCulture Instance
    {
        get
        {
            if (_instance == null)
                _instance = new ApplicationCulture();

            return _instance;
        }
    }

    private CultureInfo _currentCulture = CultureInfo.InvariantCulture;
    public CultureInfo CurrentCulture
    {
        get { return _currentCulture; }
        set
        {
            if (!CultureInfo.Equals(value, _currentCulture))
            {
                _currentCulture = value;
                NotifyCultureChanged(value);
            }
        }
    }

    public event EventHandler<CultureChangedEventArgs> CultureChanged;
    private void NotifyCultureChanged(CultureInfo culture)
    {
        if (CultureChanged != null)
            CultureChanged(this, new CultureChangedEventArgs(culture));
    }
}
4

1 に答える 1

0

この場合、解決策はユーザーの操作パターンを変更することかもしれません。ページングされたアプリケーションでは、言語を選択するために別のページに切り替え、変更されたときに元のページに戻ります。そのため、ローカライズされているが静的なリソースをすべて含めて、ページが新たに初期化されます。ページングされていないアプリケーションでは、たとえば、メインウィンドウを閉じて再度開いているときに、ダイアログを使用してUI言語を変更できます。

どちらの場合も、言語を変更する前後のViewModelインスタンスを保持するのがコツです。これにより、ローカライズされたリソースが再ロードされている間、ビューの状態と入力されたデータが保持されます。

于 2013-02-09T10:59:37.457 に答える