C# 在充满DynamicSource的大型画布上本地化时的WPF性能问题

C# 在充满DynamicSource的大型画布上本地化时的WPF性能问题,c#,wpf,C#,Wpf,我们正在开发单用户控制地铁地图,该地图支持4种语言(英语、中文、日语、韩语)的本地化,用于我们的遗留应用程序,该应用程序已经提供了带有单个png文件的地铁地图。我们选择了此处提到的基于ResourceDictionary的全球化()。我们用路径画了地铁线路,并用像 … 这很有效,但是我们发现当我们改变语言时会有几秒钟的延迟。当我们在应用程序启动后首次将语言从英语更改为汉语或日语时,此延迟至少会增加到3秒。 我确认,当用户单击语言更改按钮时,ResourceDictionary更改过程几乎没

我们正在开发单用户控制地铁地图,该地图支持4种语言(英语、中文、日语、韩语)的本地化,用于我们的遗留应用程序,该应用程序已经提供了带有单个png文件的地铁地图。我们选择了此处提到的基于ResourceDictionary的全球化()。我们用路径画了地铁线路,并用像




这很有效,但是我们发现当我们改变语言时会有几秒钟的延迟。当我们在应用程序启动后首次将语言从英语更改为汉语或日语时,此延迟至少会增加到3秒。
我确认,当用户单击语言更改按钮时,ResourceDictionary更改过程几乎没有延迟,因此大多数延迟似乎发生在渲染过程中,因为每次都必须更改每个文本块的文本。有没有办法减少或避免这种延迟?

可以使用列表列出所有电台(现在可能需要在代码隐藏/viewmodel中进行翻译,而不是改进这种情况)

如果站点需要位于地图上的唯一位置,而不是列表中(尚不清楚),那么在视图模型中创建一个字符串集合,更改后面的所有字符串,然后用于通知UI更新。这将是一次更新,而不是重新呈现UI上的每个字符串

C#:

//我建议使用一个tuple/dict,这样您就可以将键与它们的
//用于重新翻译的相应字符串
收集站名称=。。。。。。
UpdateAllStationNames()
{
//使用翻译实现更新所有名称
OnPropertyChanged(“站点名称”);
}
XAML:


//等等等等。。。
我相信这一定是一个呈现问题,正如你所说的,因为我过去曾使用一个非常类似的解决方案在一个大型程序中为我的业务进行翻译,并且在切换时没有注意到性能问题,其中肯定有600多个字符串(以不同的视图分布在整个程序中)

希望这有帮助

使用a来列出所有电台(现在可能必须在代码隐藏/viewmodel中进行翻译,而不是改进这一点)可以吗

如果站点需要位于地图上的唯一位置,而不是列表中(尚不清楚),那么在视图模型中创建一个字符串集合,更改后面的所有字符串,然后用于通知UI更新。这将是一次更新,而不是重新呈现UI上的每个字符串

C#:

//我建议使用一个tuple/dict,这样您就可以将键与它们的
//用于重新翻译的相应字符串
收集站名称=。。。。。。
UpdateAllStationNames()
{
//使用翻译实现更新所有名称
OnPropertyChanged(“站点名称”);
}
XAML:


//等等等等。。。
我相信这一定是一个呈现问题,正如你所说的,因为我过去曾使用一个非常类似的解决方案在一个大型程序中为我的业务进行翻译,并且在切换时没有注意到性能问题,其中肯定有600多个字符串(以不同的视图分布在整个程序中)


希望这有帮助

尝试使用BackgroundWorker从app.xaml.cs实际加载数据

public void SetLanguageDictionary(string lang)
{
  ResourceDictionary dict = new ResourceDictionary();
  //switch (Thread.CurrentThread.CurrentCulture.ToString())
  switch (lang)
   {
       case "english":
         dict.Source = new Uri("Lang\\win_en_US.xaml", UriKind.Relative);
         break;
       case "hindi":
         dict.Source = new Uri("Lang\\win_hi_IN.xaml", UriKind.Relative);
         break;
        }
     //this.Resources.MergedDictionaries.Add(dict);
     Application.Current.Resources.MergedDictionaries.Add(dict);
 } 

尝试使用BackgroundWorker从app.xaml.cs实际加载数据

public void SetLanguageDictionary(string lang)
{
  ResourceDictionary dict = new ResourceDictionary();
  //switch (Thread.CurrentThread.CurrentCulture.ToString())
  switch (lang)
   {
       case "english":
         dict.Source = new Uri("Lang\\win_en_US.xaml", UriKind.Relative);
         break;
       case "hindi":
         dict.Source = new Uri("Lang\\win_hi_IN.xaml", UriKind.Relative);
         break;
        }
     //this.Resources.MergedDictionaries.Add(dict);
     Application.Current.Resources.MergedDictionaries.Add(dict);
 } 

为什么不使用绑定呢?为什么首先要使用动态资源?我们的遗留应用程序已经使用资源字典和动态资源进行本地化,事实上,我们的团队打算制作一个地铁地图用户控制库,也可以在我们的下一个项目中重用。因此,我们的经理希望设计人员可以仅使用MS Blend和inhouse XAML工具维护控件,而无需任何开发人员的帮助。ooof…但是如果您创建自定义控件,它也可以100%重用,但您将拥有MVVM的所有好处。为什么不使用绑定呢?为什么首先要使用动态资源?我们的遗留应用程序已经使用资源字典和动态资源进行本地化,事实上,我们的团队打算制作一个地铁地图用户控制库,也可以在我们的下一个项目中重用。因此,我们的经理希望设计人员可以仅使用MS Blend和inhouse XAML工具维护控件,而无需任何开发人员的帮助。ooof…但如果您创建自定义控件,它也将100%可重用,但您将获得MVVM的所有好处。这是一个评论,不是回答。我尝试了它,性能有了更多改进。没有延迟是无法实现的,可能是因为我们的应用程序在一个视图的一个控件中显示600多个文本块。。。无论如何,谢谢你!这是一个评论,不是回答。我试过了,性能有了很大提高。没有延迟是无法实现的,可能是因为我们的应用程序在一个视图的一个控件中显示600多个文本块。。。无论如何,谢谢你!我们的应用程序在应用程序启动时预加载字典,所以性能似乎并没有提高。。。。无论如何,谢谢你的帮助!预加载是不可预测的,它会减慢UI呈现速度,这就是为什么如果您使用后台工作程序加载语言,它会降低加载效果,显示加载窗口不会解决问题,但会导致延迟。当应用程序启动时,我们的应用程序预加载字典,因此性能似乎没有提高。。。。无论如何,谢谢你的帮助!预加载是不可预测的,它会减慢UI呈现,这就是为什么如果使用后台工作程序加载语言,它会降低加载效果,显示加载窗口不会解决问题,但会使延迟变冷
public void SetLanguageDictionary(string lang)
{
  ResourceDictionary dict = new ResourceDictionary();
  //switch (Thread.CurrentThread.CurrentCulture.ToString())
  switch (lang)
   {
       case "english":
         dict.Source = new Uri("Lang\\win_en_US.xaml", UriKind.Relative);
         break;
       case "hindi":
         dict.Source = new Uri("Lang\\win_hi_IN.xaml", UriKind.Relative);
         break;
        }
     //this.Resources.MergedDictionaries.Add(dict);
     Application.Current.Resources.MergedDictionaries.Add(dict);
 }