Условный StaticResource для цвета в Windows Phone 8

В WP8 я хотел бы установить цвет переднего плана TextBlock на другой цвет на основе логического свойства в моей привязке. Кроме того, я также хотел бы использовать StaticResource для цвета.

Одна из возможностей, которую я рассматривал, - использовать для этого ValueConverter, но пока не удалось заставить его работать со StaticResources. Код, который я пробовал, был примерно таким:

<TextBlock Foreground="{Binding IsBlue, Converter={StaticResource BoolToColorConverter}}" />

И мой конвертер (не думал, что возврат строки сработает, но все же решил проверить):

public class BoolToColorConverter : IValueConverter{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
        return (value is bool && (bool)value) ? "{StaticResource PhoneAccentBrush}" : "{StaticResource PhoneSubtleBrush}";
        }
}

Кроме того, я изучал возможность использования DataTriggers, но увидел, что WP8 не поддерживает их напрямую.

Я еще не пробовал свойство зависимости, потому что сначала хотел убедиться, что не упустил более простой и очевидный способ исправить это.

Каков наилучший способ создать это?


person sTodorov    schedule 28.04.2014    source источник
comment
Почему бы просто не вернуть кисти, которые вы хотите? Или, если вы считаете, что это слишком жестко закодировано, добавьте свойства TrueBrush и FalseBrush в конвертер, установите их для ваших конкретных кистей в определении ресурса и x: назовите его соответствующим образом (например, SubtleConverter)?   -  person    schedule 28.04.2014
comment
@Will, спасибо за ваш комментарий. Я хотел бы использовать статический ресурс (например, PhoneAccentColor), поэтому на данный момент возвращать саму кисть нежелательно. Или можно инициализировать кисть ресурсом. Я нашел идею TrueBrush, FalseBrush очень хорошей. У вас есть пример этого?   -  person sTodorov    schedule 28.04.2014
comment
@Will, nvm, я исправил. Спасибо за вашу идею. Можете ли вы сделать из этого ответ, чтобы я мог его отметить?   -  person sTodorov    schedule 28.04.2014
comment
Давай, отметь Вячеслава правильно. У него есть оба способа сделать это и код. Это довольно распространенный шаблон, так что это не похоже на то, что я его придумал :)   -  person    schedule 28.04.2014


Ответы (1)


У вас есть два способа решить эту проблему:

Вы можете расширить свой конвертер дополнительными свойствами, которые будут заполнены привязкой

public class BooleanToBrushConverter
        : IValueConverter
    {
        public Brush TrueBrush { get; set; }
        public Brush FalseBrush { get; set; }

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool)
            {
                return (bool) value
                    ? TrueBrush
                    : FalseBrush;
            }

            return value;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

Теперь вы можете инициализировать его ресурсами страницы

<BooleanToBrushConverter x:Key="BooleanToBrushConverter" TrueBrush="{StaticResource PhoneAccentBrush}" FalseColor="{StaticResource PhoneSubtleBrush}" />

И используйте его так же просто, как

<TextBlock Foreground="{Binding IsBlue, Converter={StaticResource BooleanToBrushConverter}}" />

Второе решение — исправление вашего кода для восстановления кистей из ресурсов приложения.

public class BoolToColorConverter
  : IValueConverter{
  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {

        return (value is bool && (bool)value) ? Application.Current.Resources["PhoneAccentBrush"] : Application.Current.Resources["PhoneSubtleBrush"];
        }
}
person Viacheslav Smityukh    schedule 28.04.2014