2010-05-02 7 views
1

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

<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> 

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

Edited добавить:

То, что я действительно пытается сделать это так:

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

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

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

+0

Как вы получили свойство 'IsSelected' в вашем' UserControl', можете ли вы мне помочь http://stackoverflow.com/questions/20530010/how-to-add-isselected-property-to-a-usercontrol?noredirect = 1 # comment30696294_20530010 –

ответ

1

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

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

Прочитано this blog-post от Tim Heuer. Описывает это хорошо со многими скриншотами :). Вы также можете проверить это link.

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

+0

Спасибо. VSM - именно то, что мне нужно. Я наткнулся на это пару раз, но никогда не обращал внимания на то, что было на самом деле. – mfanto

1

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

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

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

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

+0

Спасибо за ответ. Я забыл упомянуть, я действительно позаботился о цвете границы и обо всем. Проблема заключалась в большей последовательности событий и контроле того, какой из них играл в это время. VSM - именно то, что мне нужно – mfanto

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