短時間ボタンに割り当てられたボタン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回目のクリックを識別するフラグ」を詳しく説明できますか? – vicky96
実際にあなたのコードはどこか間違っているようです。なぜ私はそれらの遅れがどこにあるのか理解していません。 私はそれを言っていました。ユーザーが最初にクリックしてから3秒間タイマーを開始すると、最初にクリック操作を行うことができます。タイマーティックが3秒で処理されたら、**に変更して**をクリックします。タイマーの実行中にユーザーが再度クリックする場合は、2アクションをクリックします。 **フラグ**を使用すると、タイマーの実行を識別し、コード行を減らすことができます。 2つのハンドラを使用する必要はありません。 – ViVi
これらの遅延はテストの目的にすぎず、何も意味するものではありません...私はあなたが言ったことを実行することでそれを得ました...ありがとう – vicky96