Я должен динамически обновлять размер шрифта в приложении WPF.С точки зрения производительности, который является лучшим подходом или каковы плюсы и минусы следующих двух подходов?
- Объединение словаря [см. API OnFontSizeChanged_MergeDictionary]
- Обновление ключа ресурса [см. API OnFontSizeChanged_UpdateResourceKey]
Я определил все используемые FontSizes в GenericResourceDictionary.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib">
<System:Double x:Key="FontSize_Small">12</System:Double>
<System:Double x:Key="FontSize_Default">14</System:Double>
<System:Double x:Key="FontSize_DefaultPlus">16</System:Double>
<System:Double x:Key="FontSize_HeaderNormal">18</System:Double>
<System:Double x:Key="FontSize_HeaderLarge">20</System:Double>
<System:Double x:Key="FontSize_MenuItem">26</System:Double>
</ResourceDictionary>
Инициированное пользователем изменение FonstSize среды выполнения во ViewModel:
Подход № 1. Создайте новый ResourceDictionary иСлей это.Удалите старый словарь размера шрифта (я не удаляю GenericResourceDictionary.xmal, поскольку он имеет гораздо больше стилей, чем просто шрифты)
private void OnFontSizeChanged_MergeDictionary(string fontSize)
{
string currentDefaultFontSize = Application.Current.Resources["FontSize_Default"]!=null ? Application.Current.Resources["FontSize_Default"].ToString() : null;
//If Current default fontsize is equal to what user is trying to set, then do nothing
if ((currentDefaultFontSize == fontSize) || fontSize.IsNullOrEmpty())
return;
double newDefaultFontSize = Convert.ToDouble(fontSize);
ResourceDictionary rd = new ResourceDictionary();
rd.Add("FontSize_Small", newDefaultFontSize - 2);
rd.Add("FontSize_Default", newDefaultFontSize);
rd.Add("FontSize_DefaultPlus", newDefaultFontSize + 2);
rd.Add("FontSize_HeaderNormal", newDefaultFontSize + 4);
rd.Add("FontSize_HeaderLarge", newDefaultFontSize + 6);
rd.Add("FontSize_MenuItem", newDefaultFontSize + 12);
//Unload old fontSizeResource
Application.Current.Resources.MergedDictionaries.Remove(_fontSizeRD);
//Load new fontSizeResource
Application.Current.Resources.MergedDictionaries.Add(resource);
//assign the new resource to class variable
_fontSizeRD=resource;
}
Подход № 2. Обновлен ключ ресурса в GenericResourceDictionary.xaml
private void OnFontSizeChanged_UpdateResourceKey(string fontSize)
{
string currentDefaultFontSize = Application.Current.Resources["FontSize_Default"]!=null ? Application.Current.Resources["FontSize_Default"].ToString() : null;
//If Current default fontsize is equal to what user is trying to set, then do nothing
if ((currentDefaultFontSize == fontSize) || fontSize.IsNullOrEmpty())
return;
double newDefaultFontSize = Convert.ToDouble(fontSize);
Application.Current.Resources["FontSize_Small"] = newDefaultFontSize - 2;
Application.Current.Resources["FontSize_Default"] = newDefaultFontSize;
Application.Current.Resources["FontSize_DefaultPlus"] = newDefaultFontSize + 2;
Application.Current.Resources["FontSize_HeaderNormal"] = newDefaultFontSize + 4;
Application.Current.Resources["FontSize_HeaderLarge"] = newDefaultFontSize + 6;
Application.Current.Resources["FontSize_MenuItem"] = newDefaultFontSize + 12;
}
Спасибо,
RDV