Укажите уровень прозрачности именованного цвета в XAML
Есть ли способ в XAML создать цветной объект из именованного цвета с другим пользовательским уровнем прозрачности? например.
<Label Background="{SkyBlue;220}" />
Я знаю, что это не работает, но просто хотел привести пример.
Ответы
Ответ 1
Один из тех случаев, когда вы сами находите ответ. Здесь правильный путь для любого будущего читателя:
<Label.Background>
<SolidColorBrush Color="SkyBlue" Opacity=".9" />
</Label.Background>
Opacity
находится между 0 и 1, 1 является полным непрозрачным (непрозрачным).
Изменить
Что касается комментария @Dai, этот метод действительно не reset или переопределяет уровень прозрачности указанного цвета, если вы ссылаетесь на ресурс цвета, который уже установил некоторую прозрачность. Например, если ваш цвет ресурса SkyBlue
с прозрачностью, установленной на 0,5, и теперь вы хотите установить вместо него 0,7, указанный выше метод не будет работать напрямую.
Чтобы справиться с этой ситуацией, все, что вам нужно сделать, это создать небольшую Converter
, которая сбрасывает альфа-компонент входного цвета. Что-то вроде этого:
public class NoTransparencyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var C = ((Color)value);
return Color.FromArgb(0xFF, C.R, C.G, C.B);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
а затем используйте его в своем XAML:
<SolidColorBrush Color="{Binding Path="YOUR_COLOR_RESOURCE" Converter={x:Static NoTransparencyConverter}}" Opacity=".9" />
Ответ 2
Просто чтобы добавить немного к этому. Да, вы можете абсолютно установить Opacity
с помощью декларативного, как вы показали в своем ответе, но вам даже не нужен набор свойств зависимости, вы можете сделать это прямо в шестнадцатеричном формате для цвета, используя Alpha
поверх ваши значения RGB
(что, кстати, обеспечивает лучшую производительность, чем opacity
). Где как, скажем, у вас есть значение для черного, и вы хотите придать ему некоторую непрозрачность. Первые 2 октета этого значения могут быть добавлены, чтобы выполнить то же самое.
Как пример;
"# 000000" = черный (твердый)
где как;
"# 33000000" = черный (с непрозрачностью 20%)
"# 77000000" = черный (непрозрачность 47%)
"# E5000000" = черный (с непрозрачностью 90%)
Просто добавьте некоторые подробности и, возможно, поможете вам в будущем, когда свойство Opacity
может быть недоступно или установлено как неизменяемое. Надеюсь, это поможет.
ADDENDUM: Стоит также отметить, что настройка свойства, такого как альфа, всегда будет более производительной, чем установка непрозрачности для всего элемента. Это также относится к сценариям HTML/CSS, в которых что-то вроде background-color: rgba(0,0,0,.5)
является лучшей практикой, чем, скажем, <div style="background: black;opacity: .5)