Как я могу сделать элементы управления WinRT XAML отключенными?

У меня есть всплывающее окно, которое содержит элементы управления DatePicker и связанные текстовые блоки, позволяющие пользователю выбирать критерии диапазона дат. У меня также есть переключатель "Использовать все даты". Если для этого установлено значение «Вкл.», Я хочу отключить элементы управления диапазоном дат или, по крайней мере, дать им вид, что они отключены.

Я пробовал вот так:

private void tglswtchAllDates_Toggled(object sender, RoutedEventArgs args)
{
    Color enabledColor = Colors.Black;
    Color disabledColor = Colors.Gray;

    txtblckDateFrom.Foreground = enabledColor;
    txtblckDateTo.Foreground = enabledColor;
    txtblckInclusive.Foreground = enabledColor;

    bool allDates = tglswtchAllDates.IsOn;

    datePickerFrom.Enabled = !allDates;
    datePickerTo.Enabled = !allDates;

    if (allDates)
    {
        txtblckDateFrom.Foreground = disabledColor;
        txtblckDateTo.Foreground = disabledColor;
        txtblckInclusive.Foreground = disabledColor;
    }
}

... но при этом я получаю всевозможные ошибки компиляции, такие как "Невозможно преобразовать тип 'Windows.UI.Color' в 'Windows.UI.Xaml.Media.Brush'" "и "Невозможно неявно преобразовать тип 'Windows.UI.Color' в 'Windows.UI.Xaml.Media.Brush'" и "'Windows.UI.Xaml.Controls.DatePicker' не содержать определение для Enabled и не может быть найден метод расширения Enabled, принимающий первый аргумент типа Windows.UI.Xaml.Controls.DatePicker (вам не хватает директивы using или ссылки на сборку?) "

Итак, каков проверенный и верный - или, по крайней мере, теоретически разумный - способ добиться этого?

ОБНОВИТЬ

С помощью Филипа я:

private void tglswtchAllDates_Toggled(object sender, RoutedEventArgs args)
{
    bool allDates = tglswtchAllDates.IsOn;

    datePickerFrom.IsEnabled = !allDates;
    datePickerTo.IsEnabled = !allDates;

    if (allDates)
    {
        txtblckDateFrom.Opacity = 0.5;
        txtblckDateTo.Opacity = 0.5;
        txtblckInclusive.Opacity = 0.5;
    }
    else
    {
        txtblckDateFrom.Opacity = 1.0;
        txtblckDateTo.Opacity = 1.0;
        txtblckInclusive.Opacity = 1.0;
    }
}

person B. Clay Shannon    schedule 07.11.2014    source источник
comment
Я думаю, что ошибки довольно очевидны - вы пытаетесь установить для свойства кисти значение цвета. !(Color is Brush). :)   -  person Filip Skakun    schedule 08.11.2014
comment
Исходный код выше не будет работать, потому что он отвечает на событие Tapped (); Я изменил его на событие Toggled (), которое действительно работает. Это чем-то напоминает мантру Джимми Бонда: Toggled, not Tapped.   -  person B. Clay Shannon    schedule 15.11.2014


Ответы (1)


Лучший способ сделать это - просто установить свойство IsEnabled в элементе управления. Он соответствующим образом обновит визуальные состояния. Если у вас хорошее визуальное восприятие и вы хотите попытаться создать «лучший внешний вид отключенного состояния» - вы можете изменить шаблон элемента управления и изменить визуальное состояние отключенного состояния, чтобы использовать другой цвет.

person Filip Skakun    schedule 07.11.2014
comment
Спасибо, Филип. TextBlock не имеет свойства IsEnabled, поэтому я использовал для них Opacity. - person B. Clay Shannon; 08.11.2014
comment
Это, безусловно, вариант. Вы все еще можете использовать SolidColorBrushees для Foregrounds, использовать VisualStateManager для управления им в XAML. Хотя это нормально. - person Filip Skakun; 08.11.2014