2016-04-08 15 views
-2

タイトルはすべてです...ボタンをアニメーション化する読み込みアイコンに変更するにはどうすればよいですか?

私は正直にここで迷っています...私はこれを行うためにWPFを使用しています。私はバックグラウンドワーカー、スレッド、Dispatcher.BeginInvoke()、async-awaitを使って私の目標を達成しましたが、無駄にしてみました...私はasync-awaitで解決しました。ここで

は私のコードです:背後

C#コード:

private async void btnLogin_Click(object sender, RoutedEventArgs e) 
{ 
    btnLogin.Visibility = Visibility.Hidden; 
    RollingIcon.Visibility = Visibility.Visible; 

    await DoLogin(); 

    btnLogin.Visibility = Visibility.Visible; 
    RollingIcon.Visibility = Visibility.Collapsed; 
} 

private Task DoLogin() 
{ 
    return TaskEx.Run(() => { 
     //code for validation if no nulls 
     this.ViewModel.ValidateUserCredentials(); 
    }); 
} 

XAML明らか

<Button x:Name="btnLogin" 
     Content="Login" 
     Margin="10,10,10,0" 
     IsDefault="True" 
     Foreground="White" 
     Background="#FF757575" 
     Click="btnLogin_Click" /> 
<local:SpinningAnimation x:Name="RollingIcon" Width="40" Height="40" Margin="10,10,10,0" Visibility="Collapsed"> 

</local:SpinningAnimation > 

ViewModelには、目に作成されているので、System.InvalidOperationExceptionがポップアップ表示されます私は別のスレッドでそれを設定しようとしているときにメインスレッド。

正しい道に私を案内し、ダークサイドから私を保存してください...

何が理解されるであろう。この質問に答えるTIA

+1

あなたはMVVMパターンを使用している場合、私はあなたが恐ろしく間違って何かを得たと思います。 ViewModelからView(UI-Thread)でタスクを実行しようとしていますか? Visibilityもプロパティにバインドする必要があります。隠しが必要な場合は、別のConverterを使用してください。ログインのために、サービスクラスやそのようなものを作成し、それを使用するコマンドにボタンをバインドします。 –

+0

@ダニエル - それは私に考えを与えた。それを試してみましょう!ありがとう!そのdownvoteは本当に痛いほどです。 –

+0

いいえ問題ありません。ここで投稿されているような目的のために、いくつかの(基本的な)MVVMの例を見てください。別のスレッドから実際にアクセスする必要がある場合は、Dispatcher Invokeを使用することができますが、その前にスレッドを理解することをお勧めします。私はあなたにdownvote、笑を与えていない –

答えて

0

:ダニエル・へ

おかげで、私はVMで新しいスレッドを配置することを見るよりも適切であることに気づきました。私は私のデザインを再加工し、これが今のように見える方法です:

VM

public void ValidateUserCredentials() 
     { 
      BackgroundWorker bgw = new BackgroundWorker(); 
      bgw.DoWork += new DoWorkEventHandler(Bgw_DoWork); 
      bgw.RunWorkerCompleted += Bgw_RunWorkerCompleted; 
      bgw.RunWorkerAsync(); 
     } 
     private void Bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      if (IsLoginSuccessful == true) 
      { 
       _controller.CloseViewModel(this); 
       _controller.InitWincollect(); 
      } 
     } 

     private void Bgw_DoWork(object sender, DoWorkEventArgs e) 
     { 
      ShowBusyIcon = true; 
      IsLoginSuccessful = _controller.ValidateUserCredential(); 
     } 
     bool _isLoginSuccessful = false; 
     private bool _showBusyIcon; 

     public bool ShowBusyIcon 
     { 
      get { return _showBusyIcon; } 
      set { _showBusyIcon = value; NotifyPropertyChanged("ShowBusyIcon"); } 
     } 

     public bool IsLoginSuccessful 
     { 
      get { return _isLoginSuccessful; } 
      set { _isLoginSuccessful = value; NotifyPropertyChanged("IsLoginSuccessful"); } 
     } 

ビュー(XAML)

 <Button x:Name="btnLogin" 
       Content="Login" Visibility="{Binding ShowBusyIcon, Converter={StaticResource inverseVisibilityConverter}}" /> 
     <local:SpinningAnimation x:Name="RollingIcon" 
            Grid.Column="1" 
            Width="40" Height="40" 
            Margin="10,10,10,0" 
            Visibility="{Binding ShowBusyIcon, Converter={StaticResource bool2VisibilityConverter}}" 
            Style="{DynamicResource SpinningAnimationStyle1}" /> 
関連する問題