0

我正在使用 .net 4,vs2010 并创建了一个用户控件,该控件需要开始折叠和透明(不透明度 0)并响应按钮单击而变得可见和不透明。

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

但是,当我从父用户控件定位此控件并触发 HelpOpen 视觉状态时,我注意到帮助控件在动画完成后突然出现 - 它没有按预期淡入。

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

我相信这是因为帮助控件仅在动画结束时才可见,因此不呈现增加不透明度的过渡。

有没有办法指定在调整不透明度值之前将可见性属性设置为可见?

4

1 回答 1

0

我不确定您是否找到了问题的答案,但了解过渡和视觉状态是两个不同的时间线可能会有所帮助。

在 blend 中编辑过渡和状态是最简单的。事件的顺序是这样的:

  1. 从状态 A 开始
  2. 某些触发器会导致“进入状态”B
  3. 从状态 A 到 B 的转换播放(0.5 秒)。过渡中的不透明度或可见性没有变化
  4. 应用/播放状态 B。这是您的不透明度和可见性变化的地方,由于状态 B 的持续时间为 0 秒,它们会立即发生

我通常做的是在混合中显式创建转换(->stateB、stateA->或 stateA->stateB 等)。然后,您可以调整应用可见性更改的时间以及不透明度更改开始/结束的时间。

于 2011-03-10T23:36:21.543 回答