[C#/WPF/prism] await에서 버튼을 누르는 데 시간이 걸리는 처리를 할 때 버튼의 연격을 방지하십시오
■ 연계 방지
버튼을 눌렀을 때 시간 처리가 필요합니다. await가 진행될 때 버튼의 연격을 방지해야 합니다.
→ https://qiita.com/tera1707/items/a6f11bd3bf2dbf97dd40
버튼을 눌렀을 때 시간이 걸리는 처리가 await에서 진행될 때 버튼이 연결되는 것을 방지하기 위해 2
→ https://qiita.com/tera1707/items/946116bf32d0f1203006
하고 싶은 일
prism(6.3)을 사용하는 WPF 앱에서 아래의 느낌 단추를 눌렀을 때의 처리를 적고 싶습니다.
UserControl 1의 일부입니다.xaml<Button Content="ボタン" Command="{Binding ButtonCommand}"/>
UserControl 1의 뷰 모델입니다.cs// コンストラクタ
public UserControl1ViewModel()
{
this.ButtonCommand = new DelegateCommand(async () =>
{
// 時間のかかる処理
await Task.Delay(500);
});
}
그러나 상술한 동작을 그대로 실행하고 연속으로 단추를 누르면'시간 걸리는 처리'가 끝나고 버튼 처리를 종료하기 전에'시간 걸리는 처리'가 여러 번 진행된다.
버튼을 한 번 눌렀을 때 일련의 단추 처리가 끝날 때까지 단추를 누르지 않기를 바랍니다. (단추를 눌렀을 때의 처리가 동시에 여러 번 뛰지 않도록 합니다.)
이번에 하는 방법.
사용DelegateCommand
ObservesProperty
의 방법과 DelegateCommand
의 매개 변수는 두 개의 구조기의 두 번째 매개 변수canExecuteMethod
가 있다.
견본 // 有効無効を設定するプロパティを一つ作成する
private bool _flag = true;
public bool Flag
{
get { return this._flag; }
set { this.SetProperty(ref _flag, value); }
}
・
・
・
// コンストラクタ
public UserControl1ViewModel()
{
this.ButtonCommand = new DelegateCommand(async() =>
{
Flag = false; // ボタン押下直後に有効無効フラグをOFF(無効)にする
await Task.Delay(500); // 時間のかかる処理
Flag = true; // 処理終了後に有効無効フラグをON(有効)にする
},
() => Flag) // CanExecuteでFlagを見て有効無効を制御
.ObservesProperty(() => Flag); // ObservesPropertyでFlagを監視するよう指定する
}
했던 일을 언어로 쓰면 다음과 같다.
<Button Content="ボタン" Command="{Binding ButtonCommand}"/>
// コンストラクタ
public UserControl1ViewModel()
{
this.ButtonCommand = new DelegateCommand(async () =>
{
// 時間のかかる処理
await Task.Delay(500);
});
}
사용
DelegateCommand
ObservesProperty
의 방법과 DelegateCommand
의 매개 변수는 두 개의 구조기의 두 번째 매개 변수canExecuteMethod
가 있다.견본 // 有効無効を設定するプロパティを一つ作成する
private bool _flag = true;
public bool Flag
{
get { return this._flag; }
set { this.SetProperty(ref _flag, value); }
}
・
・
・
// コンストラクタ
public UserControl1ViewModel()
{
this.ButtonCommand = new DelegateCommand(async() =>
{
Flag = false; // ボタン押下直後に有効無効フラグをOFF(無効)にする
await Task.Delay(500); // 時間のかかる処理
Flag = true; // 処理終了後に有効無効フラグをON(有効)にする
},
() => Flag) // CanExecuteでFlagを見て有効無効を制御
.ObservesProperty(() => Flag); // ObservesPropertyでFlagを監視するよう指定する
}
했던 일을 언어로 쓰면 다음과 같다.
// 有効無効を設定するプロパティを一つ作成する
private bool _flag = true;
public bool Flag
{
get { return this._flag; }
set { this.SetProperty(ref _flag, value); }
}
・
・
・
// コンストラクタ
public UserControl1ViewModel()
{
this.ButtonCommand = new DelegateCommand(async() =>
{
Flag = false; // ボタン押下直後に有効無効フラグをOFF(無効)にする
await Task.Delay(500); // 時間のかかる処理
Flag = true; // 処理終了後に有効無効フラグをON(有効)にする
},
() => Flag) // CanExecuteでFlagを見て有効無効を制御
.ObservesProperty(() => Flag); // ObservesPropertyでFlagを監視するよう指定する
}
시험을 준비하다
시간이 걸리는 처리 과정에서 '무효' 를 실행하는 동안, 스타일에 따라 단추가 회색으로 보입니다.
이런 점을 의식한 채 무효가 되더라도 외관을 바꿀 수 없거나 더 도망가야 할 수도 있다.
그리고 무엇보다 이런 일을 하고 싶은 버튼이 있다면 이 방법도 현실적이지만 화면에 이런 버튼이 많으면 비슷한 로고가 가득하다.
더 잘하면 안 되나...
참고 자료
Async ReactiveCommand에서 WPF의 간단한 더블 클릭 억제
https://qiita.com/soi/items/eca0601ad0fc4e401623
ReactiveProperty를 사용하면 이번에 하고 싶은 일을 쉽게 할 수 있는 모습입니다.
다만 원래부터 리액티브 프로퍼티를 사용했다면 사용하고 싶었지만 이번 저로서는 다시 누르는 것을 막기 위해 리액티브 프로퍼티를 넣는 건 어떨까...
Reference
이 문제에 관하여([C#/WPF/prism] await에서 버튼을 누르는 데 시간이 걸리는 처리를 할 때 버튼의 연격을 방지하십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/tera1707/items/a6f11bd3bf2dbf97dd40
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Async ReactiveCommand에서 WPF의 간단한 더블 클릭 억제
https://qiita.com/soi/items/eca0601ad0fc4e401623
ReactiveProperty를 사용하면 이번에 하고 싶은 일을 쉽게 할 수 있는 모습입니다.
다만 원래부터 리액티브 프로퍼티를 사용했다면 사용하고 싶었지만 이번 저로서는 다시 누르는 것을 막기 위해 리액티브 프로퍼티를 넣는 건 어떨까...
Reference
이 문제에 관하여([C#/WPF/prism] await에서 버튼을 누르는 데 시간이 걸리는 처리를 할 때 버튼의 연격을 방지하십시오), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/tera1707/items/a6f11bd3bf2dbf97dd40텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)