1

Я определил 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 такой вещи нет.

ответ

1

Я обсуждал это недавно с кем-то, и я мог бы добавить общее решение проблемы к инструменту WinRT XAML Toolkit, который будет работать аналогично DataTriggers из WPF, но сейчас я просто добавлю DependencyProperty к вашему управлению, привяжу свойство модели вашего представления и изменения стоимости - обновите визуальное состояние.

+0

Спасибо за ответ. Но когда вы говорите «обновить визуальное состояние», вы имеете в виду «переключиться на другое визуальное состояние» или «изменить логическое дерево VisualStateManager». Для первого это не работает, потому что состояние «PointerOver» может быть вызвано действием мыши, поэтому, даже если я вручную переключусь на другое состояние, состояние «PointerOver» все еще живое, оно все равно будет срабатывать, когда мышь закончилось, если я не могу «отключить» его. Для последнего мне нужно сначала найти объект VisualState в C#, но, похоже, это не в визуальном дереве. (не удается найти его с помощью GetDescendants() на кнопке) –

+1

Я имел в виду «переключиться на другое визуальное состояние». Если «PointerOver» получает избыток логики Button - очистите его «Storyboard's» и добавьте собственное пользовательское состояние «CustomPointerOver» в новую «VisualStateGroup», которая делает то, что вы хотите, чтобы кнопка ничего не знала, поэтому она не будет использовать или переопределить его. Я не думаю, что вам нужно изменить настройку вашей 'VisualStateGroup' во время выполнения, но GetDescendants() работает только для визуальных элементов дерева (' UIElement '), а' VisualStateManager' - не один. –

+0

Спасибо. Это сработало! Никогда не думал о том, что я могу использовать смешанные состояния (обе кнопки знают и не знают) в той же VisualStateGroup. Мне просто нужно обработать событие PointerEntered и на основе условия, чтобы решить, не перейти в мое состояние CustomPointerOver. –

Смежные вопросы