0

サブジェクト クラスのペアを使用して、2 セットのイベント シーケンスを起動しようとしています。このアプリケーションは描画アプリケーションであり、ユーザーがクリックすると一方のサブジェクトが onNext を起動し、ユーザーがダブルクリックすると他方のサブジェクトが OnNext を起動します。上記の場合にオブザーバブルを返す GetClick および GetDoubleClick メソッドを作成しましたが、正常に動作しているようです。以下のコードの問題は、クリック シーケンスを起動する最初のサブジェクトで onNext を呼び出した場合、ダブル クリック オブザーバブルが呼び出されないことです。最初のサブジェクトの onNext 呼び出しをコメントアウトすると、ダブルクリックのオブザーバブルが期待どおりに起動されます。誰でも以下のコードとそのアイデア/考えを見てもらえますか? 以下のコードの問題行にコメントを追加しました

public static KeyValuePair<IObservable<MapPoint>, IObservable<PointCollection>> 
    DrawPointsDynamic(this Map map)
{
    PointCollection pc = new PointCollection();
    Subject<Point> ptSubject = new Subject<Point>();
    Subject<PointCollection> ptsSubject = new Subject<PointCollection>();

    IObservable<Point> ptObs = ptSubject.Hide();
    IObservable<PointCollection> ptsObs = ptsSubject.Hide();

    map.GetClick()
        .Subscribe(next =>
            {
                var p = map.ScreenToMap(next.EventArgs.GetPosition(map));
                ptSubject.OnNext(p); //If I leave this line in, the subscription to the doubleClick below does not get called. If comment it out, the subscription below does get called as expected;
                pc.Add(p);

            });

    map.GetDoubleClick()
        .Subscribe(next =>
        {
            ptsSubject.OnNext(pc);
            pc = new ESRI.ArcGIS.Client.Geometry.PointCollection();
        });

    KeyValuePair<IObservable<MapPoint>, IObservable<ESRI.ArcGIS.Client.Geometry.PointCollection>> obs =
        new KeyValuePair<IObservable<MapPoint>, IObservable<ESRI.ArcGIS.Client.Geometry.PointCollection>>
            (ptObs, ptsObs);

    return obs;
}

また、 Hide() が何をするのかよくわかりません。すべての例にemがあるように見えるので、私はそれを使用しています。身元を隠すことの本当の意味は何ですか?

4

1 に答える 1

1

現在の問題を解決しようとするのではなく、少し rx 化することをお勧めします。最初の反復は非常に簡単です。

public static KeyValuePair<IObservable<MapPoint>, IObservable<PointCollection>> 
    DrawPointsDynamic(this Map map) 
{
    var pc = new PointCollection();
    var ptSubject = map.GetClick().Select(next => map.ScreenToMap(next.EventArgs.GetPosition(map)).Publish();
    var ptsSubject = map.GetDoubleClick().Publish();

    ptSubject.Subscribe(pc.Add);
    ptsSubject.Subscribe(_ =>  pc = new PointCollection());

    ptSubject.Connect();
    ptsSubject.Connect();

    return new KeyValuePair<IObservable<MapPoint>, IObservable<PointCollection>>(ptObs, ptsObs);
}

さて、これを見ると、あなたが本当に欲しいものはこれだと思います:

public static IObservable<PointCollection> DrawPointsDynamic(this Map map)
{
    var pcs = map.GetDoubleClick().Select(_ => new PointCollection()).Publish();
    var ps = map.GetClick().Select(next => map.ScreenToMap(next.EventArgs.GetPosition(map)));
    var ppcs = pcs.SelectMany(pc => ps.Select(p => { pc.Add(p); return pc; }).TakeUntil(pcs));

    var obs = pcs.Merge(ppcs);

    pcs.Connect();

    return obs;
}

これは、ポイントの有無にかかわらず、クリックまたはダブルクリックで PointCollection を生成するオブザーバブルを返します。

于 2010-06-25T15:59:19.620 に答える