В .NET Maui у меня есть этот XAML:
<Style x:Key = "GreenLabelStyle" TargetType = "Label">
<Setter Property = "TextColor" Value = "Green"/>
</Style>
<Label Style = "{StaticResource GreenLabelStyle}"
Text = "Some text"
TextColor = "{Binding SometimesOverrideColor}"
/>
<CheckBox IsChecked = "{Binding OverrideColorStyle}"/>
TextColor метки привязан к этому свойству:
public Color SometimesOverrideColor
{
get
{
return OverrideColorStyle ? Colors.Pink : Colors.Green; // works, but not DRY
}
}
Несмотря на то, что у меня есть указанный (привязка) TextColor, я хочу, чтобы опция «игнорировала эту настройку свойства и действовала так, как будто на метке не было явного TextColor». Я попробовал вернуть null за SometimesOverrideColor, но это не сработало. Я хочу использовать значение стиля метки (т. е. зеленого цвета).
Очевидно, я могу вернуть Colors.Green в SometimesOverrideColor, но это будет повторять значение, указанное в стиле. Если бы я изменил стиль, мне пришлось бы не забыть обновить свойство.
Я имею в виду ключевое слово inherit в CSS. Если бы я мог вернуться Color.Inherit, это было бы здорово!
@FreakyAli Да, предположим, что SometimesOverrideColor может возвращать тысячи возможных значений цвета. В некоторых случаях я хочу, чтобы он возвращал «наследовать», что означает «вести себя так, как если бы TextColor не был указан».
SometimesOverrideColor является свойством цвета? Если да, то вы обновляете его вручную (я имею в виду, что вы делаете правильно?)
@CarlJ проверьте мой ответ, как очень простую альтернативу. Вы можете сделать текст розовым, если он «недействителен», и «зеленым», если он действителен. Единственным недостатком является то, что вы хотите смешать размер из стиля 1, цвет из стиля 2, шрифт из стиля 3 и так далее. Но для переключения между стилями это одна строка в вашем XAML, используя инструментарий сообщества maui.
Я надеялся на метод, с помощью которого TextColor можно было бы установить значение, означающее «игнорировать этот параметр». Ответы, которые я получил, похоже, достигают общего эффекта моего вопроса за счет переключения между несколькими стилями. Думаю, они косвенно ответят на мой вопрос. Ответ: функции «наследовать» не существует.





Исходя из моего понимания вашего вопроса, я бы сделал что-нибудь в этом направлении.
<Style TargetType = "Label">
<Setter Property = "TextColor" Value = "Black" />
<Setter Property = "FontFamily" Value = "OpenSansRegular" />
<Setter Property = "FontSize" Value = "14" />
</Style>
<Style x:Key = "SometimesOverrideColor" TargetType = "Label">
<Setter Property = "TextColor" Value = "Pink" />
</Style>
<Style x:Key = "GreenLabelStyle" TargetType = "Label">
<Setter Property = "TextColor" Value = "Green" />
</Style>
А затем напишите короткий конвертер, который бы условно применял это:
//Name this sensibly
public abstract class WhateverColorConveter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is not bool condition)
{
return null; // in case someone uses the converter but is a smartass
}
return Application.Current.Resources.GetResource<Style>(condition ? "SometimesOverrideColor" : "GreenLabelStyle");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
GetResource — это расширение, которое я создал:
public static T GetResource<T>(this ResourceDictionary dictionary, string key)
{
if (dictionary.TryGetValue(key, out var value) && value is T resource)
return resource;
else
return default;
}
И тогда это будет использоваться с вашим стилем кода XAML, не забудьте добавить это в свои ресурсы как статический ресурс:
<ContentPage.Resources>
<converters:WhateverColorConveter x:Key = "WhateverColorConverter" />
</ContentPage.Resources>
И затем используйте это:
<Label Style = {Binding Condition, Converter = {StaticResource WhateverColorConverter}}/>
Я не знаю, насколько вы знакомы с поведением.
Если взять например CommunityToolkit.Maui и проверить ValidationBehavior.
У вас есть два стиля: ValidVisualState и InvalidVisualState.
Теперь это поведение вращается вокруг одного логического значения — IsValid. Это логическое значение изменяется в зависимости от разных подклассов. (Например, вы можете проверить текст с помощью регулярного выражения.)
В любом случае, что интересно, есть два метода: UpdateStyle и UpdateSate.
И тогда у вас есть
VisualStateManager.GoToState(view, isValid ? ValidVisualState : InvalidVisualState);
Знаете, это не обязательно должно быть логическое значение.
Вы можете задать поведение, используя Style1, Style2, Style3... И так далее. И затем одна связанная переменная, играющая роль «переключателя».
А поскольку это «стиль», вы можете изменять любые свойства, а не только цвет.
Проверьте эту ссылку: https://learn.microsoft.com/en-us/dotnet/communitytoolkit/maui/behaviors/
А если из коробки ничего не получается, можно «получить вдохновение» на создание собственного поведения. (Обратите внимание, что я не сказал «воровать». Воровать – это неправильно)
Это основано на каком-то условии? Если да, то почему бы не создать два стиля и применить их условно через конвертер или что-то еще.