У меня есть кнопка во всплывающем окне в Maui Android, которая имеет привязку к свойству IsEnabled
. Я создал конвертер, чтобы цвет текста менялся, если свойство IsSignButtonEnabled
равно 1 или 0.
Преобразователь работает правильно при изменении значения свойства. Но текст кнопки меняет цвет только тогда, когда она включена. Если отключено, то не выбирает тот цвет, который у меня в конвертере. Но программа идет по пути выбора того или иного цвета... Кроме того, свойство IsEnabled
работает, потому что отключает кнопку... Я не понимаю...
<Button
Grid.Row = "2"
Text = "Firmar"
IsEnabled = "{Binding IsSignButtonEnabled}"
TextColor = "{Binding IsSignButtonEnabled, Converter = {StaticResource ButtonColorConverter}}"
Clicked = "OpenCart"/>
public class ButtonColorConverter : IValueConverter
{
public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
{
if (value is bool isEnabled && !isEnabled)
{
return Color.FromHex("#f5092b"); // Color para botón deshabilitado
}
else
{
return Color.FromHex("#04b84a"); // Color para botón habilitado
}
}
public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
В ViewModel
у меня есть ObservableProperty
, который отлично работает
[ObservableProperty]
public bool isSignButtonEnabled;
Мне нужно, чтобы кнопка меняла один цвет на другой в зависимости от того, включена она или нет.
Я считаю, что в вашем случае использовать Converter - это излишество, вместо этого вы можете просто использовать VisualStateManager
<Button Grid.Row = "2" Text = "Firmar" Clicked = "OpenCart"
IsEnabled = "{Binding IsSignButtonEnabled}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroupList>
<VisualStateGroup Name = "CommonStates">
<VisualState Name = "Normal">
<VisualState.Setters>
<Setter Property = "TextColor" Value = "#04b84a" />
</VisualState.Setters>
</VisualState>
<VisualState Name = "Disabled">
<VisualState.Setters>
<Setter Property = "TextColor" Value = "#f5092b" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</VisualStateManager.VisualStateGroups>
</Button>
Чтобы применить Strikethrough
к тексту кнопки, пока он не имеет свойства TextDecorations
, как у Label
, вам нужно использовать код платформы; используя обработчики :
Просто для демонстрации я использовал событие PropertyChanged
, вы все равно можете его использовать, но более элегантный способ — создать специальную кнопку с настраиваемым свойством для управления этим.
<Button PropertyChanged = "CounterBtn_PropertyChanged"/>
private void CounterBtn_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == IsEnabledProperty.PropertyName)
{
var button = sender as Button;
#if ANDROID
if (!button.IsEnabled)
(button.Handler.PlatformView as MaterialButton).PaintFlags = PaintFlags.StrikeThruText;
#endif
}
}
Я включил только код для Android, посмотрите https://stackoverflow.com/a/69721069/ для iOS.
Спасибо большое, это то, что мне было нужно! А есть способ поставить текст зачеркнутым? Свойство TExtDecorations не активировано для кнопки. Извините, но я немного нуб в Мауи.
Для этого вам нужно использовать код платформы, я приглашаю вас задать отдельный вопрос или посмотреть stackoverflow.com/a/69721069
Я обновил свой ответ, включив в него зачеркнутую часть на Android.
Найдите DataTriggers или VisualStates. Этот преобразователь значений является излишним.