标签冻结并且不会更改它的Left属性

时间:2014-06-24 11:02:19

标签: c# wpf

基本上我尝试制作一个带有2个标签的选框,当一个看不见时,第二个启动它的动画,使其从左到右平滑,文本始终可见。我的问题是它确实在开始工作,但是当我重试该代码时(第二次在运行时因此旧动画停止,它刷新文本并再次启动动画)第二个标签冻结时它就是它和它的结果它的左侧属性画布没有变化(Canvas.SetLeft(L_Content_Second,-L_Content_Second.ActualWidth))

C#

它是一个名为StartAnimation()的函数;当L_Content和L_Content_Second的内容发生变化时,它会被触发

DoubleKeyFrameCollection collection = new DoubleKeyFrameCollection();
collection.Add(
new LinearDoubleKeyFrame(
    -L_Content.ActualWidth,
    KeyTime.FromTimeSpan(TimeSpan.FromSeconds(0)))
);
if (L_Content.ActualWidth > this.ActualWidth)
{
    collection.Add(
    new LinearDoubleKeyFrame(
        this.ActualWidth - (L_Content.ActualWidth / 2),
        KeyTime.FromTimeSpan(TimeSpan.FromSeconds(15)))
    );
    collection.Add(
    new LinearDoubleKeyFrame(
        this.ActualWidth * 2,
        KeyTime.FromTimeSpan(TimeSpan.FromSeconds(30)))
    );
}
else
{
    collection.Add(
    new LinearDoubleKeyFrame(
        this.ActualWidth - L_Content.ActualWidth,
        KeyTime.FromTimeSpan(TimeSpan.FromSeconds(15)))
    );
    collection.Add(
    new LinearDoubleKeyFrame(
        this.ActualWidth + (this.ActualWidth - L_Content.ActualWidth),
        KeyTime.FromTimeSpan(TimeSpan.FromSeconds(30)))
    );
}
animK.KeyFrames = collection;
animK.Duration = TimeSpan.FromSeconds(30);

animK2.KeyFrames = collection;
animK2.BeginTime = TimeSpan.FromSeconds(15);
animK2.Duration = TimeSpan.FromSeconds(30);


animK.AutoReverse = false;
animK2.AutoReverse = false;

animK.FillBehavior = FillBehavior.Stop;
animK.RepeatBehavior = RepeatBehavior.Forever;
animK2.FillBehavior = FillBehavior.Stop;
animK2.RepeatBehavior = RepeatBehavior.Forever;

Canvas.SetLeft(L_Content_Second, -L_Content_Second.ActualWidth); //This works at start, then it doesn't any more

L_Content_Second.Visibility = System.Windows.Visibility.Visible;
L_Content.BeginAnimation(Canvas.LeftProperty, animK, HandoffBehavior.SnapshotAndReplace);
L_Content_Second.BeginAnimation(Canvas.LeftProperty, animK2, HandoffBehavior.SnapshotAndReplace);

XAML

<UserControl x:Name="userControl" x:Class="Supreme.Components.ScrollLabel"
         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" 
         mc:Ignorable="d" Height="18" Width="300" MouseDoubleClick="UserControl_MouseDoubleClick_1" Background="#00000000">
    <Canvas x:Name="Container">
        <Label x:Name="L_Content" Content="" HorizontalAlignment="Left" Padding="0" Height="18" Foreground="{Binding Foreground, ElementName=userControl}" VerticalAlignment="Top"/>
        <Label x:Name="L_Content_Second" Content="" HorizontalAlignment="Left" Padding="0" Height="18" Foreground="{Binding Foreground, ElementName=userControl}" SizeChanged="L_Content_SizeChanged" VerticalAlignment="Top"/>
    </Canvas>
</UserControl>

1 个答案:

答案 0 :(得分:0)

我试图通过XAML尝试相同的

下面是相同的示例,运行它,看看它是否符合您的要求。

<Canvas x:Name="Container">
    <Canvas.Resources>
        <l:PositionConverter xmlns:l="clr-namespace:CSharpWPF"
                                 x:Key="PositionConverter" />
        <Storyboard x:Key="marquee">
            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="L_Content"
                                           RepeatBehavior="Forever"
                                           Storyboard.TargetProperty="(Canvas.Left)"
                                           Duration="0:0:10">
                <SplineDoubleKeyFrame KeyTime="0:0:0"
                                      Value="{Binding ActualWidth, ElementName=L_Content, Converter={StaticResource PositionConverter}}" />
                <SplineDoubleKeyFrame KeyTime="0:0:5"
                                      Value="{Binding ActualWidth,ElementName=Container}" />
                <SplineDoubleKeyFrame KeyTime="0:0:10"
                                      Value="{Binding ActualWidth,ElementName=Container}" />
            </DoubleAnimationUsingKeyFrames>
            <DoubleAnimationUsingKeyFrames Storyboard.TargetName="L_Content_Second"
                                           RepeatBehavior="Forever"
                                           Storyboard.TargetProperty="(Canvas.Left)"
                                           Duration="0:0:10">
                <SplineDoubleKeyFrame KeyTime="0:0:0"
                                      Value="{Binding ActualWidth, ElementName=L_Content_Second, Converter={StaticResource PositionConverter}}" />
                <SplineDoubleKeyFrame KeyTime="0:0:5"
                                      Value="{Binding ActualWidth, ElementName=L_Content_Second, Converter={StaticResource PositionConverter}}" />
                <SplineDoubleKeyFrame KeyTime="0:0:10"
                                      Value="{Binding ActualWidth,ElementName=Container}" />
            </DoubleAnimationUsingKeyFrames>
        </Storyboard>
    </Canvas.Resources>
    <TextBox x:Name="L_Content"
             Foreground="Red"
             Text="first" />
    <TextBox x:Name="L_Content_Second"
             Foreground="Green"
             Text="second">
    </TextBox>
    <Button Content="Start" Canvas.Top="30">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
                <BeginStoryboard Storyboard="{StaticResource marquee}" />
            </EventTrigger>
        </Button.Triggers>
    </Button>
    <Canvas.Triggers>
        <EventTrigger SourceName="L_Content"
                      RoutedEvent="SizeChanged">
            <BeginStoryboard Storyboard="{StaticResource marquee}" />
        </EventTrigger>
        <EventTrigger SourceName="L_Content_Second"
                      RoutedEvent="SizeChanged">
            <BeginStoryboard Storyboard="{StaticResource marquee}" />
        </EventTrigger>
        <EventTrigger RoutedEvent="SizeChanged">
            <BeginStoryboard Storyboard="{StaticResource marquee}" />
        </EventTrigger>
    </Canvas.Triggers>
</Canvas>

我在这个例子中使用了文本框来轻松更改值,为此我创建了一个转换器

namespace CSharpWPF
{
    public class PositionConverter:IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return -System.Convert.ToDouble(value);
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}