В моем проекте Maui я использую существующее расширение разметки для управления локализацией моих текстов (ссылка на расширение, LocalizationResourcemanager). Однако в конкретной кнопке мне нужно иметь возможность изменить ключ, предоставленную на расширение на основе некоторых конкретных данных из моего приложения. Я решил пойти с пользовательским расширением в качестве слоя выше базового расширения, выбрав, какой ключ для предоставления, и с некоторой логикой, чтобы вызвать изменение в XAML при изменении языка. PrettyPrint-Override ">namespace MyApp.Extensions
{
[ContentProperty(nameof(PrefixKey))]
public class DynamicTranslateExtension : IMarkupExtension
{
public string PrefixKey { get; set; }
// Indicates which property from AppData to seek for the final key
public string SuffixType { get; set; }
public BindingBase ProvideValue(IServiceProvider serviceProvider)
{
// We could return a simple string, but we use a binding so we can trigger a refresh when culture changes
return new Binding
{
Source = DynamicTranslator.Instance,
Path = $"[{PrefixKey},{SuffixType}]",
Mode = BindingMode.OneWay
};
}
object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider) => ProvideValue(serviceProvider);
}
public class DynamicTranslator : INotifyPropertyChanged
{
#region = Singleton =
private static DynamicTranslator m_Singleton;
public static DynamicTranslator Instance
{
get
{
m_Singleton ??= new DynamicTranslator();
return m_Singleton;
}
}
public DynamicTranslator()
{
WeakReferenceMessenger.Default.Register(this, (o, m) => Invalidate());
}
#endregion
public string this[string compositeKey]
{
get
{
var parts = compositeKey.Split(',');
var prefixKey = parts[0];
var suffixType = parts.Length > 1 ? parts[1] : "";
return GetDynamicTranslation(prefixKey, suffixType);
}
}
public static string GetDynamicTranslation(string prefixKey, string suffixType)
{
string finalKey;
if (string.IsNullOrEmpty(prefixKey))
{
finalKey = "!InvalidKey!";
}
else
{
var ruleset = AppData.CurrentCompetition.Ruleset;
string suffix = "";
if (suffixType == "Group")
{
suffix = (ruleset.GroupDenomination);
}
finalKey = $"{prefixKey}_{suffix}";
}
try
{
var translation = App.LocalizationResourceManager[finalKey];
return translation;
}
catch
{
return $"!{finalKey}!";
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void Invalidate()
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(null));
}
}
}
И его следует использовать в XAML следующим образом: labelText = "{ubext: DynamicTransLate GroupSelect, SuffixType = 'Group'}" (следует запросить в локализации rupecemanager select_squad или GroupSelect_Relay dependist.group. «Реле»)
В подавляющем большинстве ситуаций он работает хорошо, на эмуляторах Visual Studio или некоторых устройствах, однако при тестировании конкретных Devics, Amazon Fire Tablets я получаю NullReferenceExexexexexexex, и приложение сбивается (полное исключение ниже для получения подробной информации) при достижении инициализации
Подробнее здесь: https://stackoverflow.com/questions/796 ... rst-called
Расширение Maui Markup вызывает аварию при первом вызове ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение