Reactive UIを使用しているので、処理が完了した後にメッセージを表示して一定時間(4秒)後にこのメッセージを非表示にしたいと考えています。メッセージが隠れている期間より速く継続している場合は、タイムアウトをリセットして、最後のメッセージが表示/更新されてから4秒後にメッセージが常に非表示になります。最後のメッセージが前のメッセージと同じである場合は、隠蔽も延長する必要があります。RxUI.NET - 一定期間後にメッセージを非表示にする
現在、私はこのコードを持っていますが、これは私が望むことをしますが、それは私にとって面倒すぎます。私はRxUIを実験しているだけなので、私が何をしているのか分からないことがほとんどです。これを達成するためのより良い方法がありますか?
public class MainViewModel: ReactiveObject
{
// Message to be shown.
private string message;
public string Message { get => message; set => this.RaiseAndSetIfChanged(ref message, value);
// Flag for the UI, if the message panel should be visible.
private ObservableAsPropertyHelper<bool> isMessageVisible;
public bool IsMessageVisible => isMessageVisible.Value;
// Command that runs async process, the result is the message to be shown.
public ReactiveCommand<Unit, string> Run { get; private set; }
public MainViewModel()
{
var msg = this.WhenAnyValue(x => x.Message, x => !string.IsNullOrEmpty(x));
// If message changes, after 4 seconds return false, causing hiding the message panel.
var hide = msg.Select(x => false).Throttle(TimeSpan.FromSeconds(4), RxApp.MainThreadScheduler);
// Merge both sequences into one output property.
Observable.Merge(msg, hide).ToProperty(this, x => x.IsMessageVisible, out isMessageVisible);
Run = ReactiveCommand.CreateFromObservable(() => Observable.StartAsync(Process));
// Merge various message sources and set message property. Set Message = null to force property change.
Observable.Merge(Run, Run.ThrownExceptions.Select(x => x.Message)).Subscribe(x => { Message = null; Message = x; });
}
...
}
偉大な答え。 Rx/UIで効果を発揮するには、考え方を完全に変えなければならないようです。ありがとう。 –