[C#/WPF/prism] await에서 버튼을 누르는 데 시간이 걸리는 처리를 할 때 버튼의 연격을 방지하십시오

5801 단어 WPFPRISMC#
제비를 뽑다
■ 연계 방지
버튼을 눌렀을 때 시간 처리가 필요합니다. 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);
    });
}
그러나 상술한 동작을 그대로 실행하고 연속으로 단추를 누르면'시간 걸리는 처리'가 끝나고 버튼 처리를 종료하기 전에'시간 걸리는 처리'가 여러 번 진행된다.
버튼을 한 번 눌렀을 때 일련의 단추 처리가 끝날 때까지 단추를 누르지 않기를 바랍니다. (단추를 눌렀을 때의 처리가 동시에 여러 번 뛰지 않도록 합니다.)

이번에 하는 방법.


사용DelegateCommandObservesProperty의 방법과 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を監視するよう指定する
}
했던 일을 언어로 쓰면 다음과 같다.
  • 준비
  • 유효하지 않은 속성을 설정하는 데 사용합니다
  • DelegateCommand 업데이트 시
  • 첫 번째 매개 변수의 버튼을 눌렀을 때 처리하는 동작의 시작은 로고 ON이고, 마지막은 로고 OFF
  • 두 번째 매개변수의 Can Execute를 통해 플래그를 반환합니다(플래그를 통한 ONOFF 제어가 유효하지 않음).
  • ObservesProperty에서 Flag에 변화가 발생하면Can Execute
  • 를 실행합니다.

    시험을 준비하다


    시간이 걸리는 처리 과정에서 '무효' 를 실행하는 동안, 스타일에 따라 단추가 회색으로 보입니다.
    이런 점을 의식한 채 무효가 되더라도 외관을 바꿀 수 없거나 더 도망가야 할 수도 있다.
    그리고 무엇보다 이런 일을 하고 싶은 버튼이 있다면 이 방법도 현실적이지만 화면에 이런 버튼이 많으면 비슷한 로고가 가득하다.
    더 잘하면 안 되나...

    참고 자료


    Async ReactiveCommand에서 WPF의 간단한 더블 클릭 억제
    https://qiita.com/soi/items/eca0601ad0fc4e401623
    ReactiveProperty를 사용하면 이번에 하고 싶은 일을 쉽게 할 수 있는 모습입니다.
    다만 원래부터 리액티브 프로퍼티를 사용했다면 사용하고 싶었지만 이번 저로서는 다시 누르는 것을 막기 위해 리액티브 프로퍼티를 넣는 건 어떨까...

    좋은 웹페이지 즐겨찾기