Я определил VisualState для кнопки в ControlTemplate:Как отключить/включить VisualState на основе некоторых условий? (Metro)
<ControlTemplate x:Key="ButtonTemplate" TargetType="Button">
...
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
...
<VisualState x:Name="PointerOver">
<Storyboard>
<DoubleAnimation Storyboard.TargetName="c1" Storyboard.TargetProperty="Opacity" To="0.7"/>
</Storyboard>
</VisualState>
...
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
...
</ControlTemplate>
Но этот эффект (изменение непрозрачности при наведении курсора мыши) должна быть включена/выключена на основе состояния ViewModel, так как я делаю что с XAML?
Я попытался создать привязку для значения значения DoubleAnimation, это не работает, потому что Storyboard замерзает. Я также думаю, что sth как селектор шаблонов, но для VisualState Manager такой вещи нет.
Спасибо за ответ. Но когда вы говорите «обновить визуальное состояние», вы имеете в виду «переключиться на другое визуальное состояние» или «изменить логическое дерево VisualStateManager». Для первого это не работает, потому что состояние «PointerOver» может быть вызвано действием мыши, поэтому, даже если я вручную переключусь на другое состояние, состояние «PointerOver» все еще живое, оно все равно будет срабатывать, когда мышь закончилось, если я не могу «отключить» его. Для последнего мне нужно сначала найти объект VisualState в C#, но, похоже, это не в визуальном дереве. (не удается найти его с помощью GetDescendants() на кнопке) –
Я имел в виду «переключиться на другое визуальное состояние». Если «PointerOver» получает избыток логики Button - очистите его «Storyboard's» и добавьте собственное пользовательское состояние «CustomPointerOver» в новую «VisualStateGroup», которая делает то, что вы хотите, чтобы кнопка ничего не знала, поэтому она не будет использовать или переопределить его. Я не думаю, что вам нужно изменить настройку вашей 'VisualStateGroup' во время выполнения, но GetDescendants() работает только для визуальных элементов дерева (' UIElement '), а' VisualStateManager' - не один. –
Спасибо. Это сработало! Никогда не думал о том, что я могу использовать смешанные состояния (обе кнопки знают и не знают) в той же VisualStateGroup. Мне просто нужно обработать событие PointerEntered и на основе условия, чтобы решить, не перейти в мое состояние CustomPointerOver. –