【问题标题】:Force UI update on the fly, after changing current culture in WPF在 WPF 中更改当前文化后,强制 UI 即时更新
【发布时间】:2009-12-17 16:32:31
【问题描述】:

我需要通过应用程序菜单支持 UI 语言更改。 文本使用资源文件进行本地化(类似于方法 1 here

如果我在 ctor 调用 InitializeComponent() 之前设置了 Thread.CurrentThread.CurrentUICulture,则 UI 将按应有的方式更改。

但是,如果在应用程序的正常运行期间更改了 CurrentUICulture,则不会更新控件(即无论当前的文化如何,文本都保持不变)。

有没有办法根据CurrentUICulture强制刷新控件?

【问题讨论】:

    标签: .net wpf internationalization


    【解决方案1】:

    您可以将the ResourceDictionary approachDynamicResourceMarkupExtension 一起使用。使用这种方法,您可以换出代表用户选择的语言的资源字典,DynamicResourceMarkupExtension 将确保新值反映在 UI 中。

    此外,如果您愿意涉足定制解决方案领域,LocalizeMarkupExtension 提供在 this WPF tutorial 中。

    【讨论】:

    • Drew Marsh,ResourceDictionary 链接不再有效。你能指出 .net 4.5 中的新链接吗?
    • 链接似乎有效。页面标题为“如何:使用 ResourceDictionary 管理可本地化的字符串资源”。
    【解决方案2】:

    假设菜单的DataContext是一个实现INotifyPropertyChanged的对象,你可以通过在PropertyChanged事件中指定null(无)来刷新所有控件...

    来自msdn

    PropertyChanged 事件可以指示 对象上的所有属性都有 通过使用 null 参考(Visual Basic 中没有)或 String.Empty 作为属性名 PropertyChangedEventArgs。

    【讨论】:

    • 谢谢。然而,大部分 UI 只是静态字符串,因此没有任何 DataContext。
    【解决方案3】:

    我尝试过并且效果很好的一种方法是这种方法,在 ViewModel 中分配属性后调用:

    private void AllowUiToUpdate()
    {
        var frame = new DispatcherFrame();
    
        var dispatcherOperationCallback = new DispatcherOperationCallback(delegate
            {
                frame.Continue = false;
                return null;
            });
    
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, dispatcherOperationCallback, null);
    
        Dispatcher.PushFrame(frame);
    }
    

    【讨论】:

    • 不知道为什么会这样......你能详细说明一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2019-06-08
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    相关资源
    最近更新 更多