2016-06-12 7 views
0

短時間ボタンに割り当てられたボタンonclickハンドラ/メソッドを変更しようとしています。WPF一時的にボタンクリックに割り当てられたメソッドを変更する

つまり、ユーザーがボタンをクリックすると、ボタンの主要タスクが実行されます。ユーザーがボタンをクリックすると、ボタンの2次タスクが実行されます。

ユーザーが3秒以内にボタンをクリックしない場合、プライマリタスクはボタンに復元されます。

ボタンの機能を変更して復元することに成功しましたが、2次メソッドが完全に実行されていません。

ここにxamlとcsコードがあります...私は何をしようとしているのか、どこで問題に直面しているのかを簡単に分かるように、csコードにコメントを追加しました。

MainWindow.xaml:

<Window x:Class="UITest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:UITest" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="519" Width="656"> 
    <StackPanel> 
     <Button x:Name="button1" Width="60" Height="30" Content="button" Margin="10 10 0 0" BorderThickness="0" BorderBrush="{x:Null}" Padding="0" HorizontalAlignment="Left" VerticalAlignment="Top" Background="Bisque" FontSize="16"> 
      <Button.Style> 
       <Style TargetType="Button"> 
        <Setter Property="Template"> 
         <Setter.Value> 
          <ControlTemplate TargetType="Button"> 
           <StackPanel Background="{TemplateBinding Background}"> 
            <ContentPresenter /> 
           </StackPanel> 
          </ControlTemplate> 
         </Setter.Value> 
        </Setter> 
       </Style> 
      </Button.Style> 
     </Button> 

     <Label x:Name="label1" Width="200" Height="30" Margin="10 10 0 0" BorderThickness="0" BorderBrush="{x:Null}" Padding="0" HorizontalAlignment="Left" VerticalAlignment="Top" FontSize="20" Content="label"> 
     </Label> 
    </StackPanel> 
</Window> 

MainWindow.xaml.cs

namespace UITest 
{ 
    public partial class MainWindow : Window 
    { 
     bool isClick2Done = true; 
     public MainWindow() 
     { 
      InitializeComponent(); 
      this.button1.Click += Button1_Click1; 
     } 

     //primary function of button 
     private async void Button1_Click1(object sender, RoutedEventArgs e) 
     { 
      label1.Content = "primary"; 

      //wait for a second, to avoid human error of double click 
      await Task.Delay(1000); 

      changeButtonFunction(); 
     } 

     //secondary function of button 
     private async void Button1_Click2(object sender, RoutedEventArgs e) 
     { 
      isClick2Done = false; //click2 isn't done yet 
      label1.Content = "secondary"; 

      //delay function 
      //to observe whether this secondary method gets completed or not 
      await Task.Delay(3000); 
      label1.Content = "secondary after wait"; 
      await Task.Delay(2000); 
      isClick2Done = true; //click2 is now done 
      restoreButtonFunction(); 
     } 

     private async void changeButtonFunction() 
     { 
      //set new function for button 
      this.button1.Click -= Button1_Click1; 
      this.button1.Click += Button1_Click2; 

      //button is now green - indicator that button has new function 
      button1.Background = Brushes.Green; 

      //keep new function for specific seconds 
      //is there a better way of doing this? 
      await Task.Delay(3000); 

      //restore original button function 
      while(!isClick2Done) { } 
      restoreButtonFunction(); 
     } 

     private async void restoreButtonFunction() 
     { 
      button1.Background = Brushes.Bisque; 
      label1.Content = "label"; 
      this.button1.Click -= Button1_Click2; 
      this.button1.Click += Button1_Click1; 
     } 
    } 
} 

編集:私は、問題があると思う - ...私は」んButton1_Click2(前に完了しますrestoreButtonFuntion())私は確信していません。

答えて

2

これと1つの共通イベントハンドラにタイマーを使用します。

ユーザーが最初にクリックすると、タイマーが開始します。タイマ間隔を3000 msに設定します。したがって、タイマーティックが処理されるとき、主な機能を復元します。ボタンを最初にクリックしている間、主要な機能を実行し、タイマーを開始します。

フラグは、同じハンドラ内の2番目のクリックを識別するためにも使用できます。タイマティックが3000ミリ秒で処理されたときにフラグをリセットします。

これは、canExecuteを適切に設定することによって、リレーコマンドとインタラクティブ機能を使用して達成することもできます。

+0

「2回目のクリックを識別するフラグ」を詳しく説明できますか? – vicky96

+0

実際にあなたのコードはどこか間違っているようです。なぜ私はそれらの遅れがどこにあるのか理解していません。 私はそれを言っていました。ユーザーが最初にクリックしてから3秒間タイマーを開始すると、最初にクリック操作を行うことができます。タイマーティックが3秒で処理されたら、**に変更して**をクリックします。タイマーの実行中にユーザーが再度クリックする場合は、2アクションをクリックします。 **フラグ**を使用すると、タイマーの実行を識別し、コード行を減らすことができます。 2つのハンドラを使用する必要はありません。 – ViVi

+0

これらの遅延はテストの目的にすぎず、何も意味するものではありません...私はあなたが言ったことを実行することでそれを得ました...ありがとう – vicky96

関連する問題