代码之家  ›  专栏  ›  技术社区  ›  Nicolas

如何在运行时显示由视图模型属性控制的闪烁覆盖并再次将其关闭?

  •  0
  • Nicolas  · 技术社区  · 7 年前

    如何在应用程序的主窗口部分显示闪烁的通知消息,同时在覆盖关闭时保持覆盖下面的控件可访问(可单击)?

    简单的部分是创建覆盖并为动画构建情节提要:

    <Window.Resources>
        <Style x:Key="ds_NotificationStyle" TargetType="DockPanel">
            <Setter Property="Opacity" Value="0" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding EnableNotification}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard Name="ds_BeginCallNotification">
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.2" />
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0.4" Duration="0:0:0.4" AutoReverse="True" RepeatBehavior="Forever" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <StopStoryboard BeginStoryboardName="ds_BeginCallNotification" />
                    </DataTrigger.ExitActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    

    在XAML的下面,覆盖元素(有一个填充了其他元素的网格 DockPanel 位于它们的上方):

    <DockPanel Grid.RowSpan="2" Name="ds_NotificationPanel" Style="{StaticResource ds_NotificationStyle}" Panel.ZIndex="200" Background="AntiqueWhite" Height="100" VerticalAlignment="top">
        <Viewbox>
            <TextBlock Text="{Binding IncomingCallNotification}" Margin="5" Foreground="Brown" FontWeight="Bold" />
        </Viewbox>
    </DockPanel>
    

    为了解决这个问题 DockPanel公司 的可见性必须设置为 Collapsed . 但是如何在动画前后调整这种可见性呢?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Nicolas    7 年前

    使用以情节提要的运行时零为目标的动画,在开头切换可见性:

    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Visibility">
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Visible}"/>
    </ObjectAnimationUsingKeyFrames>
    

    Collapsed .

    使用另一个 Storyboard 那是在 ExitActions

    <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Visibility">
        <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Collapsed}" />
    </ObjectAnimationUsingKeyFrames>
    

    以下是完整的解决方案 DockPanel 元素未更改):

    <Window.Resources>
        <Style x:Key="ds_NotificationStyle" TargetType="DockPanel">
            <Setter Property="Opacity" Value="0" />
            <Setter Property="Visibility" Value="Collapsed" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding EnableNotification}" Value="True">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard Name="ds_BeginCallNotification">
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Visibility">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Visible}"/>
                                </ObjectAnimationUsingKeyFrames>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="0:0:0.2" />
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0.4" Duration="0:0:0.4" AutoReverse="True" RepeatBehavior="Forever" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                    <DataTrigger.ExitActions>
                        <StopStoryboard BeginStoryboardName="ds_BeginCallNotification" />
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:00.2" />
                                <ObjectAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetProperty="Visibility">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:00" Value="{x:Static Visibility.Collapsed}" />
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.ExitActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Window.Resources>
    

    对你们中的许多人来说,这可能很简单,也很明显,但我花了很多时间才弄明白。如果能得到这样的回答,我会很感激的,我已经把我的解决方案贴在这里了。