开发者

VisualState that starts collapsed interfers with other animations in WPF .NET 4

开发者 https://www.devze.com 2023-01-20 00:16 出处:网络
I am using .net 4, vs2010 and have created a user control that needs to start collapsed and transparent (opacity 0) and become visible and opaque in response to a button click.

I am using .net 4, vs2010 and have created a user control that needs to start collapsed and transparent (opacity 0) and become visible and opaque in response to a button click.

<UserControl x:Class="Ihi.LeadRetrieval.Client.Views.HelpView"
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
                     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
                     xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
                     mc:Ignorable="d" 
                     d:DesignHeight="300" d:DesignWidth="300">
<Grid x:Name="HelpGrid" Visibility="Collapsed" Opacity="0">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="HelpStateGroup">
            <VisualStateGroup.Transitions>
                <VisualTransition GeneratedDuration="0:0:0.5">
                    <VisualTransition.GeneratedEasingFunction>
                        <CircleEase EasingMode="EaseInOut"/>
                    </VisualTransition.GeneratedEasingFunction>
                </VisualTransition>
            </VisualStateGroup.Transitions>
            <VisualState x:Name="HelpOpen">
            <Storyboard>
                <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)" Storyboard.TargetName="HelpGrid">
                    <EasingDoubleK开发者_StackOverflow中文版eyFrame KeyTime="0" Value="0.95"/>
                </DoubleAnimationUsingKeyFrames>
                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="HelpGrid">
                    <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
                </ObjectAnimationUsingKeyFrames>
            </Storyboard>
            </VisualState>
            <VisualState x:Name="HelpClosed">
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>
    <Border Background="#00427A" CornerRadius="3">
        <DockPanel Margin="5">
            <ContentPresenter DockPanel.Dock="Bottom" Margin="12,10,0,0" Content="{Binding Path=Detail}" Style="{StaticResource HelpText}"/>
            <Label Style="{StaticResource HelpHeaderText}" Content="{Binding Path=Header}" DockPanel.Dock="Left" MaxHeight="50"/>
            <Button x:Name="CloseHelpButton" Style="{StaticResource HelpButtonStyle}" Content="X" HorizontalAlignment="Right" VerticalAlignment="Top" DockPanel.Dock="Right" MaxHeight="50">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="Click">
                        <ei:GoToStateAction x:Name="CloseAction" StateName="HelpClosed"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Button>
        </DockPanel>
    </Border>
</Grid>

However, when I target this control from a parent user control and trigger the HelpOpen visual state, I notice that the help control is appears abruptely after the animation completes - it does not fade in as expected.

<view:HelpView x:Name="helpView" />
<Button x:Name="ButtonOpen" Margin="0,0,25,0" VerticalAlignment="Top" Content="Open">
   <i:Interaction.Triggers>
        <i:EventTrigger EventName="Click">
            <ei:GoToStateAction TargetObject="{Binding ElementName=helpView}" StateName="HelpOpen"/>
        </i:EventTrigger>
   </i:Interaction.Triggers>
</Button>

I believe this is because the help control is becoming visible only at the end of the animation and thus the transition of increasing opacity isn't rendered.

Is there a way to specify that the visibility property be set to visible before the opacity value is adjusted?


I'm not sure if you found the answer to your question, but it might help to know that a transition and a visual state are two different timelines.

It is easiest to edit your transition and state in blend. The sequence of events is this:

  1. Begin in state A
  2. Some trigger causes a "Go to state" B
  3. The transition from state A to B plays (0.5 seconds). There are no changes to opacity or visibility in your transition
  4. The state B is applied/played. Here is where your opacity and visibility changes are, and since state B has a duration of 0 seconds, they occur immediately

What I usually do is explicitly create the transition in blend (either ->stateB, stateA->, or stateA->stateB, etc). Then you can adjust when the visibility change is applied and when the opacity change begins/ends.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号