WPF 性能问题在本地化与大画布,其中充满了动态资源



我们正在开发单个UserControl地铁地图,该地图支持4种语言(英语,中文,日语,韩语(的本地化,用于我们的旧应用程序,该应用程序已经提供了带有单个png文件的地铁地图。我们选择了基于资源字典的全球化,这里提到了(https://www.codeproject.com/Articles/515960/Globalization-in-WPF-using-ResourceDictionary(。我们用 Path 绘制了地铁线,并用单独的 TextBlock 制作了每 616 个车站名称,例如


<TextBlock Foreground="#ff000000" FontSize="5.50" Canvas.Left="xxx" Canvas.Top="yyy" Text="{DynamicResource keyStationName1" /><TextBlock Foreground="#ff000000" FontSize="5.50" Canvas.Left="xxx" Canvas.Top="yyy" Text="{DynamicResource keyStationName2" />...

<TextBlock Foreground="#ff000000" FontSize="5.50" Canvas.Left="xxx" Canvas.Top="yyy" Text="{DynamicResource keyStationName616" />

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

是否可以使用列表框列出所有电台(现在可能必须在代码隐藏/视图模型中完成翻译,而不是改善这一点(?

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

C#:

//I suggest a tuple/dict for this so you can relate the keys and their 
//respective strings for re-translation
Collection<type> StationNames = ......
UpdateAllStationNames()
{
//Update all the names using your translation implementation
OnPropertyChanged("StationNames");
}

XAML:

<TextBlock Text="{Binding StationNames[0]"} />
//etc etc...

我相信这一定是一个渲染问题,正如您的理论,因为我过去曾使用非常相似的解决方案在大型程序中为我的业务进行翻译,并且在切换时没有注意到性能问题,并且其中一定有超过 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);
} 

最新更新