Чтобы уточнить @ ответ серина и проиллюстрировать работу с нетривиальным многозначным условием: мне нужно было показать наложение «затемнения» на элемент для логического условия NOT a AND (b OR NOT c)
,
Что касается фона, это вопрос с множественным выбором. Если пользователь выбирает неправильный ответ, он становится отключенным (затемняется и не может быть выбран снова). Автоматизированный агент имеет возможность сфокусировать на любом конкретном выборе, чтобы дать объяснение (граница выделена). Когда агент фокусируется на предмете, он не должен быть затемнен , даже если он отключен . Все предметы, которые не в фокусе, помечены не сфокусированы и должны быть затемнены.
Логика для затемнения такова:
NOT IsFocused AND (IsDefocused OR NOT Enabled)
Чтобы реализовать эту логику, я сделал обобщенный IMultiValueConverter
, названный (неловко), чтобы соответствовать моей логике
// 'P' represents a parenthesis
// ! a && ( b || ! c )
class NOT_a_AND_P_b_OR_NOT_c_P : IMultiValueConverter
{
// redacted [...] for brevity
public object Convert(object[] values, ...)
{
bool a = System.Convert.ToBoolean(values[0]);
bool b = System.Convert.ToBoolean(values[1]);
bool c = System.Convert.ToBoolean(values[2]);
return !a && (b || !c);
}
...
}
В XAML я использую это в MultiDataTrigger
в <Style><Style.Triggers>
ресурсе
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<!-- when the equation is TRUE ... -->
<Condition Value="True">
<Condition.Binding>
<MultiBinding Converter="{StaticResource NOT_a_AND_P_b_OR_NOT_c_P}">
<!-- NOT IsFocus AND ( IsDefocused OR NOT Enabled ) -->
<Binding Path="IsFocus"/>
<Binding Path="IsDefocused" />
<Binding Path="Enabled" />
</MultiBinding>
</Condition.Binding>
</Condition>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<!-- ... show the 'dim-out' overlay -->
<Setter Property="Visibility" Value="Visible" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
И для полноты, мой конвертер определен в ResourceDictionary
<ResourceDictionary xmlns:conv="clr-namespace:My.Converters" ...>
<conv:NOT_a_AND_P_b_OR_NOT_c_P x:Key="NOT_a_AND_P_b_OR_NOT_c_P" />
</ResourceDictionary>