简体   繁体   English

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

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

I am working on adding localization to an application that uses .NET 3.5. 我正在为使用.NET 3.5的应用程序添加本地化。 The application is using MVVM pattern and a command to change the culture. 该应用程序正在使用MVVM模式和用于更改区域性的命令。 Everything is working well except that the DatePicker control does not change language until after I click on it. 一切工作正常,除了DatePicker控件在单击它之前不会更改语言。 At this point, the selected date text will change properly. 此时,所选日期文本将正确更改。 The dropdown calendar in the control also will not change language until I move the month either forward or backwards once. 在我将月份向前或向后移动一次之前,控件中的下拉日历也不会更改语言。

How can I force the control to refresh with the proper language as soon as the command is run to change culture? 一旦运行命令以更改区域性,如何强制控件以正确的语言刷新?

I have tried several things with no success including: 我尝试了几项没有成功的事情,包括:

  • DatePickerControl.InvalidateVisual() DatePickerControl.InvalidateVisual()
  • DatePickerControl.UpdateLayout() DatePickerControl.UpdateLayout()
  • Firing NotifyPropertyChanged on the CultureChanged event for SelectedDate in VM 对VM中的SelectedDate的CultureChanged事件触发NotifyPropertyChanged
  • DatePickerControl.Dispatcher.Invoke(DispatcherPriority.Render, EmptyDelegate) DatePickerControl.Dispatcher.Invoke(DispatcherPriority.Render,EmptyDelegate)

App.xaml.cs 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;
    }

View 视图

<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 command ViewModel命令

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

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

ApplicationCulture 应用文化

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));
    }
}

In this case, the solution might be in changing the user interaction pattern. 在这种情况下,解决方案可能是更改用户交互模式。 In a paged application, I'd switch to a separate page in order to select the language, and switch back to the original page when it is changed. 在页面应用程序中,我将切换到单独的页面以选择语言,并在更改后切换回原始页面。 So, the page would be initialized anew, including all localized but otherwise static resources. 因此,该页面将被重新初始化,包括所有本地化但静态的资源。 In a non-paged application, you could eg use a dialog to change the UI language, while you close and reopen the main window. 在未分页的应用程序中,可以在关闭并重新打开主窗口时使用对话框更改UI语言。

In both cases, the trick would be to preserve the ViewModel instance from before and after changing the language, so that the view state and the entered data are preserved while the localized resources are reloaded. 在这两种情况下,技巧都是在更改语言之前和之后保留ViewModel实例,以便在重新加载本地化资源时保留视图状态和输入的数据。

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

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