2013-09-27 4 views
0

На данный момент я экспериментирую. Мой текущий сценарий: у меня есть StoryBoard для перехода между 2 UserControls (например, он сжимает текущий UserControl, а затем растет другой).WPF Связать UserControl с ресурсом

Что я хочу сделать, так это иметь 2 UserControls, определенные как часть XAML, с ключами «Текущий» и «Следующий». Ток должен быть привязан к просматриваемому в данный момент UserControl. Следующее должно быть привязано до перехода, поэтому StoryBoard знает, к какому элементу нужно перейти. Вот где я застрял: ПОЛНОСТЬЮ используя XAML, как бы это сделать?

У меня есть простая раскадровка, что является ресурсом в ItemsControl, а также два UserControl пунктов:

<ItemsControl.Resources> 
    <Storyboard x:Key="TransitionStoryboard"> 
    <!-- Shrink this one. --> 
    <DoubleAnimation Storyboard.Target="{Binding Current}" Storyboard.TargetProperty="Width" To="0" Duration="0:0:1"/> 
    <!--Grow the next.--> 
    <DoubleAnimation Storyboard.Target="{Binding Next}" Storyboard.TargetProperty="Width" To="100" BeginTime="0:0:1" Duration="0:0:1"/> 
    </Storyboard> 

    <UserControl x:Key="Current"/> 
    <UserControl x:Key="Next" Width="0"/> 
</ItemsControl.Resources> 

Так что, когда я определяю новый UserControl, который принадлежит к ItemsControl (как это):

<my:Control1 x:Name="ControlOne"/> 

Как установить «Текущий» элемент UserControl на ControlOne? Затем, когда я хочу перейти, как установить его как «Далее»? И как я могу изменить их после триггера?

Thanks

ответ

2

Это полный беспорядок. Вы, кажется, совершенно неправильно понимаете, как используются статические ресурсы.

Для достижения того, что вы пытаетесь сделать, вы должны сначала решить, что вызовет анимацию. В идеале это должно быть примерно DependencyProperty на ваших элементах управления или в собственности на вашей модели просмотра (которая реализует INotifyPropertyChanged). Например, вы можете объявить свойство IsSelected. Затем вы должны создать стиль, который запускает анимацию «расти», когда выбран элемент управления, и запускает анимацию «сжиматься», когда управление теряет выделение. Например:

<Style TargetType="Control" x:Key="FancyStyle"> 
    <Style.Triggers> 
     <DataTrigger Binding={Binding IsSelected} Value="True"> 
      <DataTrigger.EnterActions> 
        <BeginStoryboard Storyboard="{StaticResource YourGrowAnim}"/> 
      </DataTrigger.EnterActions> 
      <DataTrigger.ExitActions> 
        <BeginStoryboard Storyboard="{StaticResource YourShrinkAnim}"/> 
      </DataTrigger.ExitActions> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

Затем вы должны назначить этот стиль для каждого элемента управления, вы хотите анимированные этот путь и настроить переходы между свойствами IsSelected. Вы также можете использовать EventTrigger и привязывать анимацию к событиям (например, вы можете запускать эти анимации, когда управление получает/теряет фокус).

Вы также должны исправить свою анимацию «расти», скорее всего, она будет работать.

+0

Это хороший ответ, спасибо. Он достигает того, что я пытался сделать, совершенно по-другому. Что касается вашей первой пары предложений - Ой! Да, я признаю, что ты прав. Знаете ли вы хорошие ресурсы для WPF? Я считаю, что большинство из них не хватает сплоченности, или они объясняют, как что-то делать, не объясняя, почему это работает. – MrShoes

+0

@MrShoes, http://www.amazon.com/Pro-WPF-4-5-Presentation-Foundation/dp/1430243651 :) –

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