如何让WPF中的Text-Marquee顺畅淡入淡出

时间:2015-12-17 09:33:12

标签: c# wpf xaml animation

我有一个带有TextBlock和图像的WPF Canvas。文本是动画的,但它看起来并不平滑。我尝试了不同FPS设置和持续时间的多种组合,但它不会变得更好。 我还想让文本在开始和结束时淡入/淡出。但我发现没有办法这样做。

目前它看起来像那样: Example message

如何顺利获取动画?我怎样才能顺利淡入淡出?

在您提出要求之前,我需要将窗口显示为不可见,因为我使用WpfAppBar并且该组件需要HWND。

这是画布xaml:

<Canvas x:Name="canMain" HorizontalAlignment="Stretch" VerticalAlignment="Center">
    <Border x:Name="boLogo"  Panel.ZIndex="2" Height="40" Background="Gray" Canvas.Left="0" Canvas.Top="-20">
        <Image Height="39" Width="auto" Margin="5, 0, 5, 0" Source="pack://siteoforigin:,,,/Resources/Logo.png" />
    </Border>
    <TextBlock x:Name="tbInfo" Panel.ZIndex="1"  Visibility="Hidden" RenderOptions.BitmapScalingMode="NearestNeighbor" FontSize="32" TextOptions.TextFormattingMode="Display" TextOptions.TextRenderingMode="ClearType" FontFamily="Arial" FontWeight="Bold" Padding="5" HorizontalAlignment="Stretch" VerticalAlignment="Center">
        <TextBlock.RenderTransform>
            <TranslateTransform x:Name="AnimatedTranslateTransform" X="0" Y="0" />
        </TextBlock.RenderTransform>
    </TextBlock>
</Canvas>

动画文字的代码:

public void ShowWindow(Brush fontColor, Brush backgroundColor, string str) {
        var helper = new WindowInteropHelper(this);
        helper.EnsureHandle();
        tbInfo.Foreground = fontColor;
        this.Background = backgroundColor;

        tbInfo.Text = str;
        this.Height = 39;
        this.Width = SystemParameters.WorkArea.Width;
        this.Left = SystemParameters.PrimaryScreenWidth - this.Width;

        ShowWindowInvisible();
        WpfAppBar.AppBarFunctions.SetAppBar(this, WpfAppBar.ABEdge.Top);
        Visibility = Visibility.Visible;

        int duration = 10 + str.Length / 5;

        TextMarquee(duration);
    }

private void TextMarquee(int duration)
    {
        Timeline.DesiredFrameRateProperty.OverrideMetadata(
            typeof(Timeline),
            new FrameworkPropertyMetadata { DefaultValue = 60 }
        );

        double height = canMain.ActualHeight - tbInfo.ActualHeight;
        tbInfo.Margin = new Thickness(0, height / 2, 0, 0);
        DoubleAnimation doubleAnimation = new DoubleAnimation();
        doubleAnimation.From = canMain.ActualWidth;
        doubleAnimation.To = tbInfo.ActualWidth *-1;
        doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
        doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(duration));
        tbInfo.BeginAnimation(Canvas.LeftProperty, doubleAnimation);
        tbInfo.Visibility = Visibility.Visible;
    }

private void ShowWindowInvisible()
    {
        var width = Width;
        var height = Height;
        var windowStyle = WindowStyle;
        var showInTaskbar = ShowInTaskbar;
        var showActivated = ShowActivated;

        Width = 0;
        Height = 0;
        WindowStyle = WindowStyle.None;
        ShowInTaskbar = false;
        ShowActivated = false;
        Show();
        Visibility = Visibility.Hidden;

        Width = width;
        Height = height;
        WindowStyle = windowStyle;
        ShowInTaskbar = showInTaskbar;
        ShowActivated = showActivated;
    }

0 个答案:

没有答案