الامتدادات التفاعلية لـ .NET (RX): اتخاذ إجراء بمجرد اكتمال جميع الأحداث

StackOverflow https://stackoverflow.com/questions/3867858

  •  28-09-2019
  •  | 
  •  

سؤال

كدليل على المفهوم ، أريد أن أكتب "تم" في مربع نص بعد، بعدما تم فحص خانة الاختيار وتم الضغط على مفتاح في مربع نص (في أي ترتيب). أتوقع أن يتعامل هذا الرمز مع هذا ، لكنه يكتب بمجرد حدوث أي من الحدثين. شكرا لمساعدتك.

var seq = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged")
   .Merge(Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress"));

seq.Subscribe((unused) => this.resultTextBox.Text = "Done");
هل كانت مفيدة؟

المحلول

يمكنك استخدام الملاحظة. عندما مثل ذلك (أضفت مربع اختيار إضافي لهذا المثال):

var checkChanged  = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged");
var check1Changed = Observable.FromEvent<EventArgs>(this.checkBox1, "CheckedChanged");
var keyPress      = Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress");

var plan1 = checkChanged
            .And(check1Changed).And(keyPress)
            .Then((cc, cc1, kp) => "Done.");

var when = Observable.When(plan1);

when.Subscribe((result) => this.resultTextBox.Text = result);

أيضًا ، إذا تمكنت من الانضمام إلى خطط أخرى معًا ، على سبيل المثال ، إذا كان من الممكن "القيام" بالأشياء عندما تطلق مجموعة واحدة من الأحداث ، أو أيضًا عند إطلاق مجموعة أخرى من الأحداث:

var checkChanged  = Observable.FromEvent<EventArgs>(this.checkBox, "CheckedChanged");
var check1Changed = Observable.FromEvent<EventArgs>(this.checkBox1, "CheckedChanged");
var keyPress      = Observable.FromEvent<KeyPressEventArgs>(this.textBox, "KeyPress");
var keyPress1     = Observable.FromEvent<KeyPressEventArgs>(this.textBox1, "KeyPress");

var plan1 = checkChanged.And(check1Changed).And(keyPress).Then((cc, cc1, kp) => "Done.");
var plan2 = keyPress.And(keyPress1).Then((kp, kp1) => "Alternate done.");

var join = Observable.When(plan1, plan2);

نصائح أخرى

إذا كنت بحاجة إلى حدوث كلا الحدثين - فكر في استخدام Zip. سوف دمج الحدث إذا أي من مصادر مدمجة ترفعها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top