UserControl как ListBoxItem и IsSelected - PullRequest
1 голос
/ 03 мая 2010

У меня есть пользовательский контроль, который я хочу использовать в качестве ListBoxItem.

<ListBox.ItemTemplate>
     <DataTemplate>
          <local:MyUserControl/>
     </DataTemplate>
</ListBox.ItemTemplate>

Я бы хотел сыграть раскадровку, когда пользовательский контроль не выбран.

<UserControl.Resources>
     <Style TargetType="{x:Type UserControl}">
          <Style.Triggers>
               <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListBoxItem}, Mode=FindAncestor}}" Value="False">
                    <DataTrigger.EnterActions>
                         <BeginStoryboard Storyboard="{StaticResource OnMouseLeaveSB}"/>
                    </DataTrigger.EnterActions>
               </DataTrigger>
          </Style.Triggers>
     </Style>
 </UserControl.Resources>

Но раскадровка никогда не срабатывает. Есть ли лучший способ сделать это?

Отредактировано для добавления:

Что я действительно пытаюсь сделать это так:

Когда мышь находится над UserControl, я хочу сыграть раскадровку (OnMouseEnterSB). Когда мышь покидает UserControl, я хочу сыграть в другую раскадровку (OnMouseLeaveSB). У меня все это работает нормально.

Однако когда выбран элемент UserControl и мышь уходит, я НЕ хочу играть в раскадровку.

Наконец, когда пользовательский элемент управления не выбран, я хочу сыграть в раскадровку OnMouseLeaveSB.

Ответы [ 2 ]

1 голос
/ 03 мая 2010

Если я правильно понимаю ваш вопрос, вы хотите воспроизвести эту анимацию 'OnMouseLeaveSB', когда какой-либо ListViewItem теряет выбор. Но в вашем триггере вы играете анимацию для всех невыбранных предметов. Следовательно, даже если это работает, это будет не то, что вы хотели.

Причина, по которой раскадровка не срабатывает , заключается в том, что BlueHighlight по умолчанию скрывает вашу анимацию. Чтобы избавиться от этого, нужно установить цвет границы, который описан здесь www.HereIsYourLink.com

Чтобы достичь желаемого , вам нужно вставить раскадровку в Trigger.ExitActions со значением IsSelected 'True'.

Если вы не спешите, взгляните и на VSM.

1 голос
/ 03 мая 2010

У меня нет опыта работы с WPF, скорее, я девушка из Silverlgiht, и в Silverlight то, что вы описываете, называется «VisualStateManager» (просто добавьте его, оно также доступно в WPF).

С помощью VSM вы определяете различные визуальные проявления для каждого «состояния» вашего (пользовательского) элемента управления (mouseover, mouseleft, normal), а также в зависимости от предыдущего и / или следующего состояния вы можете определять различные переходы между этими состояниями (или вы можете использовать переход по умолчанию для перемещения между различными состояниями).

Читать это сообщение в блоге Тима Хойера. Описывает это хорошо со многими скриншотами :). Вы также можете проверить эту ссылку .

Используя VSM, состояния и анимации являются частью элемента управления, а не приложения с кучей обработчиков событий и анимацией. Begin (). Мне очень нравится и рекомендую:)

...