繁体   English   中英

文化更改后,如何强制WPF Toolkit DatePicker在UI中刷新?

[英]How to force WPF Toolkit DatePicker to refresh in UI after culture change?

我正在为使用.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));
    }
}

在这种情况下,解决方案可能是更改用户交互模式。 在页面应用程序中,我将切换到单独的页面以选择语言,并在更改后切换回原始页面。 因此,该页面将被重新初始化,包括所有本地化但静态的资源。 在未分页的应用程序中,可以在关闭并重新打开主窗口时使用对话框更改UI语言。

在这两种情况下,技巧都是在更改语言之前和之后保留ViewModel实例,以便在重新加载本地化资源时保留视图状态和输入的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM