0

这是我的第一个 WPF 项目。我试图通过一堆横幅形状的PNG垂直堆叠在一起来获得滚动信用效果。

我目前的方法是在 StackPanel 中有一堆图像。每张图像大约为 1024x150,大约有 30 张图像。它们垂直堆叠。

我从 0,200 开始 StackPanel,所以大部分都在屏幕外。然后我有一个 StoryBoard(在 Blend 中创建)将它沿 Y 轴平移,一直到屏幕外。动画开始了,但问题是最初在屏幕外的 StackPanel 部分从不绘制并保持切断状态。只有 StackPanel 最初可见的区域会进行动画处理。

感觉 StackPanel 需要重新粉刷。这种方法会奏效还是我需要做一些完全不同的事情?

XAML,省略 Window 和 Window.Triggers:

<Window.Resources>
    <Storyboard x:Key="sb_HR">
        <DoubleAnimationUsingKeyFrames 
                    BeginTime="00:00:00" 
                    Storyboard.TargetName="StackPanel1"
                    Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)">
            <SplineDoubleKeyFrame KeyTime="00:00:30" Value="-1950"/>
        </DoubleAnimationUsingKeyFrames>
    </Storyboard>
</Window.Resources>


<Grid x:Name="LayoutRoot">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1024" />
    </Grid.ColumnDefinitions>        
    <StackPanel   Name="StackPanel1" Margin="0,0,0,0" RenderTransformOrigin="0.5,0.5">
        <StackPanel.RenderTransform>
            <TransformGroup>
                <ScaleTransform ScaleX="1" ScaleY="1"/>
                <SkewTransform AngleX="0" AngleY="0"/>
                <RotateTransform Angle="0"/>
                <TranslateTransform X="0" Y="0"/>
            </TransformGroup>
        </StackPanel.RenderTransform>
        <Image Margin="0,50,0,0" Source="title.png"  x:Name="title" Height="150" VerticalAlignment="Top" Stretch="Uniform"></Image>
        <Image Margin="0,50,0,0" Source="1.png" x:Name="V1_L1" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="2.png" x:Name="V1_L2" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="3.png" x:Name="V1_L3" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="4.png" x:Name="V1_L4" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="5.png" x:Name="V1_L5" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="6.png" x:Name="V1_L6" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="7.png" x:Name="V1_L7" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
        <Image Margin="0,50,0,0" Source="8.png" x:Name="V1_L8" Height="150" VerticalAlignment="Top" Stretch="Uniform" ></Image>
    </StackPanel>
</Grid>

编辑:我找到了 ClipToBounds 并尝试将其设置为 false,但它已经是 false。MSDN 上有人和我有同样的问题,在http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/5764645e-cb4f-4137-a525-4e8698ee43b6 - 我不认为有解决方案呢。

4

2 回答 2

2

我看到你可以尝试两件事:

  1. 在 StackPanel 周围使用带有禁用滚动条的 ScrollViewer。遗憾的是,您不能直接为滚动偏移设置动画,因此您需要在后面的代码中创建类似计时器的东西并定期调用 ScrollToVerticalOffset()。

  2. 尝试将 StackPanel 放在 Canvas 上并为 Canvas.Top 设置动画(设置在 StackPanel 上)而不是 RenderTransforms。

如果您需要,我将提供代码示例。

安德烈

于 2009-07-05T14:18:02.113 回答
2

我同意 Andrej,只需创建一个禁用滚动条的新列表框类型。

您可以为滚动偏移设置动画,我现在正在编写的自定义控件中发生了这种情况。这是列表框类中的一个函数:


Duration animationDuration = new Duration(new TimeSpan(0, 0, 0, 0, _scrollSpeed));
DoubleAnimation animateHscroll = new DoubleAnimation(thisScrollViewer.HorizontalOffset, TargetHorizontalOffset, animationDuration);

thisScrollViewer.BeginAnimation(HorizontalScrollOffsetProperty, animateHscroll);

于 2009-09-11T17:33:39.817 回答