Как объединить раскадровки в XAML? - PullRequest
1 голос
/ 22 марта 2012

Я ищу способ объединить раскадровки в другие раскадровки в XAML.

В следующем примере Thing1 и Thing2 - это два текстовых блока, которые скользят по холсту сверху и снизу соответственно.Я предполагаю, что только одно, другое или ни одно не видно в любое время, поэтому я настроил три состояния в VisualStateManager, внутри одной VisualStateGroup, с переходами между различными состояниями.

Я бы хотелуметь писать раскадровки для Thing1ToThing2 и Thing2ToThing1 в контексте других, более простых раскадровок.Например, есть ли способ заставить Thing1ToThing2 раскадровки вызывать / вызывать / ссылаться / состоять из Thing1Out и Thing2In?Конечно, код можно дублировать, но можем ли мы сделать что-то лучше этого?Или есть ли способ заставить VisualTransitions делать больше?

Я бы предпочел сохранить это в XAML, если это возможно, и таким образом, чтобы оно масштабировалось для большего количества вещей.

Спасибо!Давид

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Width="500" Height="500" Background="PaleTurquoise" >

    <UserControl.Resources>

        <Storyboard x:Key="Thing1In">
            <DoubleAnimation Storyboard.TargetName="Thing1" Storyboard.TargetProperty="(Canvas.Top)" Duration="0:0:2" To="100" />
        </Storyboard>

        <Storyboard x:Key="Thing1Out">
            <DoubleAnimation Storyboard.TargetName="Thing1" Storyboard.TargetProperty="(Canvas.Top)" Duration="0:0:2" To="-100" />
        </Storyboard>

        <Storyboard x:Key="Thing2In">
            <DoubleAnimation Storyboard.TargetName="Thing2" Storyboard.TargetProperty="(Canvas.Bottom)" Duration="0:0:2" To="100" />
        </Storyboard>

        <Storyboard x:Key="Thing2Out">
            <DoubleAnimation Storyboard.TargetName="Thing2" Storyboard.TargetProperty="(Canvas.Bottom)" Duration="0:0:2" To="-100" />
        </Storyboard>

        <Storyboard x:Key="Thing1ToThing2">
            <!--do Thing1Out then (or at the same time as) Thing2In-->
        </Storyboard>

        <Storyboard x:Key="Thing2ToThing1">
            <!--do Thing2Out then (or at the same time as) Thing1In-->
        </Storyboard>

    </UserControl.Resources>

    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="ThingStates">

            <VisualState x:Name="NothingInState" />
            <VisualState x:Name="Thing1InState" Storyboard="{StaticResource Thing1In}" />
            <VisualState x:Name="Thing2InState" Storyboard="{StaticResource Thing2In}" />

            <VisualStateGroup.Transitions>
                <VisualTransition From="Thing1InState" To="Thing2InState" Storyboard="{StaticResource Thing1ToThing2}" />
                <VisualTransition From="Thing2InState" To="Thing1InState" Storyboard="{StaticResource Thing2ToThing1}" />
                <VisualTransition From="Thing1InState" To="NothingInState" Storyboard="{StaticResource Thing1Out}" />
                <VisualTransition From="Thing2InState" To="NothingInState" Storyboard="{StaticResource Thing2Out}" />
            </VisualStateGroup.Transitions>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

    <Canvas ClipToBounds="True">

        <TextBlock x:Name="Thing1" Text="Thing1" FontSize="60" Canvas.Top="-100" Canvas.Left="100" />

        <TextBlock x:Name="Thing2" Text="Thing2" FontSize="60" Canvas.Bottom="-100" Canvas.Left="100" />

    </Canvas>
</UserControl>
...