Я создаю редактор настроек, где разработчики плагинов могут определять свой собственный пользовательский интерфейс для настройки своих плагинов. Я реализую функцию, чтобы скрыть определенные «продвинутые» элементы, если флажок снят.Стиль WPF в зависимости от состояния флажка
Флажок XAML тривиальна:
<CheckBox Name="isAdvanced">_Advanced</CheckBox>
В идеале (подробнее об этом позже), реализаторы просто добавить флаг передовых элементов управления (которые должны быть скрыты, когда «продвинутым» флажок снят), как так :
<Button library:MyLibraryControl.IsAdvanced="True">My Button</Button>
проблема заключается в создании магии в сокрытии IsAdvanced="True"
элементов при isAdvanced.IsChecked == false
. У меня есть желаемое поведение с помощью этого стиля на оконном элементе:
<Window.Resources>
<Style TargetType="Button">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding (library:MyLibraryControl.IsAdvanced), RelativeSource={RelativeSource Mode=Self}}" Value="True" />
<Condition Binding="{Binding IsChecked, ElementName=isAdvanced}" Value="False" />
</MultiDataTrigger.Conditions>
<Setter Property="UIElement.Visibility" Value="Collapsed" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
Однако, этот метод представляет две проблемы:
- Это только добавляет функциональность кнопок и ничего другого. Флаг
IsAdvanced
может (должен быть способен) быть добавлен к любым визуальный элемент. - Он заменяет/отменяет стили, которые в противном случае были бы на кнопке.
Есть ли какой-либо другой способ создания функциональности, которую я хочу? Я не боюсь работать в коде, но элегантное решение XAML идеально (так как это просто изменение пользовательского интерфейса, кроме сохранения состояния флажка в настройках пользователя).
Приходят в голову некоторые другие способы обозначения продвинутых элементов. Они включают использование динамического ресурса и непосредственное связывание:
<Button Visibility="{DynamicResource IsAdvancedVisibility}">My Button</Button>
<Button Visibility="{Binding IsChecked, RelativeSource={...}, ValueConverter={...}}">My Button</Button>
Используя словарь ресурсов, вероятно, работать, но это кажется очень плохим решением, как состояние UI не кажется, что она должна принадлежать в словаре. Связывание вручную - это беспорядок, потому что состояние флажка должно быть отправлено каким-то образом, а помимо значений жесткого кодирования я не вижу, чтобы это не стало беспорядком.
Оба этих альтернативных решения связывают семантику («это расширенный вариант») по внешнему виду («расширенные параметры должны быть свернуты»). Исходя из мира HTML, я знаю, что это очень плохо, и я отказываюсь подчиняться этим методам, если не обязательно.
Это, безусловно, является жизнеспособным вариантом, и звучит довольно чистый. Проблема в том, что это, вероятно, приведет к тому, что код шаблона будет посыпать здесь и там, чтобы распространить поведение до пользовательского интерфейса. Однако это дает плагинам больше контроля. – strager 2010-11-25 08:28:17