WPF перевод анимации XAML в код C # - PullRequest
1 голос
/ 21 октября 2011

Я нашел отличную анимацию WIPE здесь: http://www.wearerighteous.com/programming/slidewipe-transition-for-your-windows-in-wpf/

РЕДАКТИРОВАТЬ: ссылка выше не работает, поэтому вы должны увидеть эту http://learnwpf.com/post/2006/10/03/How-can-I-create-a-e2809cwipee2809d-effect-to-transition-between-two-images-in-WPF.aspx Он имеет тот же исходный код.

В основном код там такой:

<Window.OpacityMask>
<LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
    <GradientStop Offset="0" Color="Black" x:Name="BlackStop"/>
    <GradientStop Offset="0" Color="Transparent" x:Name="TransparentStop"/>
</LinearGradientBrush> 
<Window.OpacityMask>
    <Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <EventTrigger.Actions>
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation Storyboard.TargetName="TransparentStop"
                      Storyboard.TargetProperty="Offset" By="1"  Duration="0:0:1"/>
                    <DoubleAnimation Storyboard.TargetName="BlackStop"
                      Storyboard.TargetProperty="Offset" By="1" Duration="0:0:1"
                      BeginTime="0:0:0.05" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
</Window.Triggers>

Я пытался "перевести" анимацию в код на c #, и я не могу этого сделать. Я пробовал несколько версий, например:

public void WipeAnimation(FrameworkElement ObjectToAnimate)
    { 
        LinearGradientBrush OpacityBrush = new LinearGradientBrush();
        OpacityBrush.StartPoint = new Point(1,0);
        OpacityBrush.EndPoint   = new Point(0,0);
        GradientStop BlackStop = new GradientStop(Colors.Black, 0);
        GradientStop TransparentStop = new GradientStop(Colors.Transparent, 0);
        OpacityBrush.GradientStops.Add(t);
        OpacityBrush.GradientStops.Add(t2);
        ObjectToAnimate.OpacityMask = OpacityBrush;

        Duration d = TimeSpan.FromSeconds(4);
        Storyboard sb = new Storyboard() { Duration = d };
        DoubleAnimation DA = new DoubleAnimation() {  By=1 , Duration = d };
        DoubleAnimation DA2 = new DoubleAnimation() { By=1 , Duration = d };
        sb.Children.Add(DA); sb.Children.Add(DA2);
        Storyboard.SetTarget(DA,TransparentStop);
        Storyboard.SetTarget(DA2,BlackStop);
        Storyboard.SetTargetProperty(DA, new PropertyPath("Offset"));
        Storyboard.SetTargetProperty(DA2, new PropertyPath("Offset"));
        sb.Begin();
    }

Или замена в SetTarget Rows вроде:

Storyboard.SetTarget(DA, (ObjectToAnimate.OpacityMask as LinearGradientBrush).GradientStops[1]);

Но с моим FrameworkElement ничего не происходит. Я назвал его для окна (как в примере с сайта), и единственное, что происходит, - это установка OpacityMask. Анимация начинается и заканчивается (я добавил событие Completed в раскадровку с помощью MessageBox, чтобы посмотреть, работает ли оно). Я не знаю, что еще делать.

Пожалуйста, помогите! :( Есть идеи?

EDIT: Может я плохо объяснил вопрос. Я пытаюсь создать анимацию, которая у меня есть в XAML, в коде C # .... Я уже два дня пытаюсь найти решение. Я не знаю, почему не работает версия C # ...

Ответы [ 3 ]

1 голос
/ 23 октября 2011

Я не уверен, почему вышеприведенное не работает, но вот что работает: вместо создания раскадровки просто используйте метод BeginAnimation () для каждого GradientStop:

BlackStop.BeginAnimation(GradientStop.OffsetProperty, DA2);
TransparentStop.BeginAnimation(GradientStop.OffsetProperty, DA);
1 голос
/ 09 февраля 2012
public void WipeAnimation(FrameworkElement ObjectToAnimate)
{ 
    LinearGradientBrush OpacityBrush = new LinearGradientBrush();
    OpacityBrush.StartPoint = new Point(1,0);
    OpacityBrush.EndPoint   = new Point(0,0);
    GradientStop BlackStop = new GradientStop(Colors.Black, 0);
    GradientStop TransparentStop = new GradientStop(Colors.Transparent, 0);
    OpacityBrush.GradientStops.Add(t);
    OpacityBrush.GradientStops.Add(t2);
    ObjectToAnimate.OpacityMask = OpacityBrush;

    this.RegisterName("TransparentStop", TransparentStop);
    this.RegisterName("BlackStop", BlackStop);

    Duration d = TimeSpan.FromSeconds(4);
    Storyboard sb = new Storyboard() { Duration = d };
    DoubleAnimation DA = new DoubleAnimation() {  By=1 , Duration = d };
    DoubleAnimation DA2 = new DoubleAnimation() { By=1 , Duration = d };
    sb.Children.Add(DA); sb.Children.Add(DA2);
    Storyboard.SetTargetName(DA,"TransparentStop");
    Storyboard.SetTargetName(DA2,"BlackStop");
    Storyboard.SetTargetProperty(DA, new PropertyPath("Offset"));
    Storyboard.SetTargetProperty(DA2, new PropertyPath("Offset"));
    sb.Begin();
}

EDIT:

Этот код великолепен! Но у него есть 3 ошибки, поэтому я нашел его. Правильная версия здесь:

 public void WipeAnimation(FrameworkElement ObjectToAnimate)
        {
            LinearGradientBrush OpacityBrush = new LinearGradientBrush();
            OpacityBrush.StartPoint = new Point(1, 0);
            OpacityBrush.EndPoint = new Point(0, 0);
            GradientStop BlackStop = new GradientStop(Colors.Black, 0);
             GradientStop TransparentStop = new GradientStop(Colors.Transparent, 0);
            OpacityBrush.GradientStops.Add(BlackStop);
            OpacityBrush.GradientStops.Add(TransparentStop);
            ObjectToAnimate.OpacityMask = OpacityBrush;

            this.RegisterName("TransparentStop", TransparentStop);
            this.RegisterName("BlackStop", BlackStop);

            Duration d = TimeSpan.FromSeconds(4);
            Storyboard sb = new Storyboard() { Duration = d };
            DoubleAnimation DA = new DoubleAnimation() { By = 1, Duration = d };
            DoubleAnimation DA2 = new DoubleAnimation() { By = 1, Duration = d };
            sb.Children.Add(DA); sb.Children.Add(DA2);
            Storyboard.SetTargetName(DA, "TransparentStop");
            Storyboard.SetTargetName(DA2, "BlackStop");
            Storyboard.SetTargetProperty(DA, new PropertyPath("Offset"));
            Storyboard.SetTargetProperty(DA2, new PropertyPath("Offset"));
            sb.Begin(this);
        }

Строка ошибок:

OpacityBrush.GradientStops.Add(t); ->  OpacityBrush.GradientStops.Add(BlackStop);

OpacityBrush.GradientStops.Add(t2); -> OpacityBrush.GradientStops.Add(TransparentStop);

sb.Begin(); ->  sb.Begin(this);
0 голосов
/ 21 октября 2011

Кажется, отлично работает в моем случае .....

 <Window x:Class="WpfHierarchicalDataGrid.Window4"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window4" 
    MinHeight="100"
    MinWidth="100"
    AllowsTransparency="True"
    Opacity="0.7"
    WindowState="Normal"
    WindowStyle="None">
  <Window.OpacityMask>
    <LinearGradientBrush StartPoint="0,0" EndPoint="1,1">
        <GradientStop Offset="0" Color="Black"
                      x:Name="BlackStop"/>
        <GradientStop Offset="0" Color="Transparent"
                      x:Name="TransparentStop"/>
    </LinearGradientBrush>
  </Window.OpacityMask>
  <Window.Triggers>
    <EventTrigger RoutedEvent="Window.Loaded">
        <EventTrigger.Actions>
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation 
                        Storyboard.TargetName="TransparentStop"
                        Storyboard.TargetProperty="Offset"
                        By="1"  Duration="0:0:1"/>
                    <DoubleAnimation
                       Storyboard.TargetName="BlackStop"
                       Storyboard.TargetProperty="Offset" By="1"
                       Duration="0:0:1"
                       BeginTime="0:0:0.05" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger.Actions>
    </EventTrigger>
  </Window.Triggers>
  <Grid>
    <Image Source="Water_lilies.jpg" Stretch="UniformToFill" />
  </Grid>
</Window>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...