2016-03-31 23 views
0

次のように私がボタンを持っている:アニメーションが完了したらコマンドを正しく実行する方法は?

<Button x:Name ="Btn_Import" Grid.Row="33" Grid.Column="15" Grid.ColumnSpan="36" Grid.RowSpan="36" > 
      <Button.Template> 
       <ControlTemplate> 
        <Grid RenderTransformOrigin="0.5,0.5" x:Name="bg"> 
         <Image x:Name ="import_image" Source="{Binding ImportBtnBaseImagePath}"/> 

        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter TargetName="import_image" Property="Source" Value="{Binding ImportBtnOverImagePath}" /> 
         </Trigger> 

         <Trigger Property="ButtonBase.IsPressed" Value ="True"> 
          <!-- press effect --> 
          <Setter TargetName="bg" Property="RenderTransform"> 
           <Setter.Value> 
            <ScaleTransform ScaleX="0.9" ScaleY="0.9"/> 
           </Setter.Value> 
          </Setter> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Button.Template> 

      <Button.Triggers> 
       <EventTrigger RoutedEvent="PreviewMouseDown" > 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimation Storyboard.TargetName="Studio" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:2" > 
           <i:Interaction.Triggers> 
            <i:EventTrigger EventName="Completed"> 
             <i:InvokeCommandAction Command="{Binding NavigateCommand}" CommandParameter="ImportButtonClickParmeters" /> 
            </i:EventTrigger> 
           </i:Interaction.Triggers> 
          </DoubleAnimation> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </Button.Triggers> 

     </Button> 

私は、このボタンを2秒間フェードアウトするためにいくつかの他のコントロールにアニメーションをtrigerしたい、その後、アニメーションは 'を介して他のいくつかのビューをナビゲートするために完了したらNavigateCommand '。しかし、次のエラーが表示されます。

Additional information: Specified value of type 'System.Windows.Interactivity.EventTrigger' must have IsFrozen set to false to modify.

+0

私の意見では、この質問は編集しないでくださいが、あなたの問題が異なるため、新しい質問をする必要があります。この質問をロールバックしてみてください(おそらく他の誰かがそれに興味を持っているかもしれません)。そして、新しいものを作成してください。 –

+0

さて、私はそれを元に戻しました。私は新しい質問へのリンクを投稿します – Ivan

+0

ここに私の新しい質問を見てください:http://stackoverflow.com/questions/36591570/how-to-speciafy-a-target-for-animation – Ivan

答えて

3

問題はよく分かっているbugです。 Unluckly私はcommon solutionがこの場合正しく動作しないことがわかりました。

アプリケーションMVVMに準拠させたい場合は、コマンドを実行するタスクがある「偽の」アニメーションを作成することをお勧めします。もちろん、このアニメーションはストーリーボードの最後のアニメーションでなければなりません。それはその値を変更しませんので、あなたは、あなたが望むこと何でもdependecyプロパティにこのアニメーションを適用することができます見ることができるように

public class CommandFakeAnimation : AnimationTimeline 
{ 
    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.Register("Command", typeof(ICommand), typeof(CommandFakeAnimation), new UIPropertyMetadata(null)); 

    public static readonly DependencyProperty CommandParameterProperty = 
     DependencyProperty.Register("CommandParameter", typeof(object), typeof(CommandFakeAnimation), new PropertyMetadata(null)); 

    public CommandFakeAnimation() 
    { 
     Completed += new EventHandler(CommandAnimation_Completed); 
    } 

    public ICommand Command 
    { 
     get 
     { 
      return (ICommand)GetValue(CommandProperty); 
     } 
     set 
     { 
      SetValue(CommandProperty, value); 
     } 
    } 

    public object CommandParameter 
    { 
     get 
     { 
      return GetValue(CommandParameterProperty); 
     } 
     set 
     { 
      SetValue(CommandParameterProperty, value); 
     } 
    } 

    private void CommandAnimation_Completed(object sender, EventArgs e) 
    { 
     if (Command != null && Command.CanExecute(CommandParameter)) 
     { 
      Command.Execute(CommandParameter); 
     } 
    } 

    protected override Freezable CreateInstanceCore() 
    { 
     return new CommandFakeAnimation(); 
    } 

    public override Type TargetPropertyType 
    { 
     get 
     { 
      return typeof(Object); 
     } 
    } 

    public override object GetCurrentValue(object defaultOriginValue, object defaultDestinationValue, AnimationClock animationClock) 
    { 
     return defaultOriginValue; 
    } 
} 

この

CommandFakeAnimationコードです。完了したらコマンドを実行するだけです。

今、私たちは、XAMLに新しいアニメーションを使用することができます。

<Button.Triggers> 
    <EventTrigger RoutedEvent="PreviewMouseDown"> 
     <BeginStoryboard> 
      <Storyboard> 
       <DoubleAnimation Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="0:0:2" /> 
       <local:CommandFakeAnimation Duration="0:0:0" Command="{Binding Path=YourCommand, Mode=OneWay}" 
              CommandParameter="{Binding Path=YourParameter, Mode=OneWay}" 
              Storyboard.TargetProperty="Opacity" /> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger> 
</Button.Triggers> 

私はそれはあなたを助けることができると思います。

+0

ありがとう回答。 CommandFakeAnimationでコマンドパラメータを渡す方法を教えてください。私がこれを追加した場合:CommandParameter = "{Binding ImportButtonClickParmeters}"と表示され、コマンドパラメータにアクセスできないと表示されます – Ivan

+0

ありがとうございました!やってみます。 – Ivan

+0

はい、本当にうまくいきます!どうもありがとうございます! – Ivan

関連する問題