4

Rx.Net を使用して画像エディターを構築しているとします。ユーザーは、マウスを使用してキャンバスを操作できます。適用される操作は、現在選択されているツールによって異なります。たとえば、「描く」ツールと「消す」ツールがあるかもしれません。一度に選択できるツールは 1 つだけです。

3 つのストリームがあります。1 つはマウス イベント用です。1 つはマウスをクリックして発行されたコマンド用です。ツール選択用の別のもの:

IObservable<ITool> toolSelection;
IObservalbe<MouseState> mouse;
IObservable<ICommand> commands;

ストリームは他の 2 つに依存します。commandsユーザーがマウスをクリックするとコマンドが発行され、生成されるコマンドは最後に選択されたツールに依存します。コマンドは、ユーザーがツールを変更したときに発行されるべきではなく、マウスをクリックしたときにのみ発行されるべきであることに注意してください。

これで、最後に選択したツールを次のような変数に格納できます。

var selectedTool = defaultTool;
toolSelection.Subscribe(x => selectedTool = x);

ストリームselectedToolを構築するために使用できます。commands

var commands = mouse.Select(x => selectedTool.CreateCommand(x));

ただし、これは「リアクティブ」な方法とは思えません。ストリーム構成を使用してこれと同じロジックを実現できますか?

私は見ましCombineLatestたが、ユーザーがツールを切り替えると、不要なイベントが生成されます。ユーザーがクリックしたときにのみコマンドを発行したい。

4

1 に答える 1

4

が必要なようです.Switch()

このコードを試してください:

IObservable<ICommand> commands =
    toolSelection
        .Select(t => mouse.Select(m => t.CreateCommand(m)))
        .Switch();

.Switch()この場合、拡張メソッドは を受け取り、外側のオブザーバブルによって生成された最新のオブザーバブルを取得し、そこからのみ値を生成し、以前の値を破棄することによって、それを に変換しますIObservable<IObservable<ICommand>>IObservable<ICommand>

または、より英語の用語では、ユーザーが新しいツールをクリックするたびに、最新のツールのみを使用して構築された一連のマウス コマンドを 1 つの適切なクエリで取得します。

于 2016-07-07T00:00:00.487 に答える