Изменение цвета текста кнопки в Maui Android в зависимости от значения «Включено»

У меня есть кнопка во всплывающем окне в 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;

Мне нужно, чтобы кнопка меняла один цвет на другой в зависимости от того, включена она или нет.

Найдите DataTriggers или VisualStates. Этот преобразователь значений является излишним.

H.A.H. 19.04.2024 11:24
0
1
132
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что в вашем случае использовать 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 не активировано для кнопки. Извините, но я немного нуб в Мауи.

hugo vazquez 19.04.2024 12:31

Для этого вам нужно использовать код платформы, я приглашаю вас задать отдельный вопрос или посмотреть stackoverflow.com/a/69721069

Cfun 19.04.2024 16:41

Я обновил свой ответ, включив в него зачеркнутую часть на Android.

Cfun 19.04.2024 17:03

Другие вопросы по теме