我寫Windows窗體控件擴展像下面從控件的事件(使用Rx和RX-的WinForms 2.2.2)創建觀測量:接收 - 爲Windows可觀察擴展窗體控件
''' <summary>
''' Returns an IObservable(Of String) that fires when the TextChanged event fires and the text has actually changed.
''' </summary>
''' <remarks>It's useful to follow this with .Throttle if you wish to throttle the events.</remarks>
<Extension()>
Public Function ObserveTextChanged(textbox As TextBox) As IObservable(Of String)
Return Observable _
.FromEventPattern(Of EventArgs)(textbox, "TextChanged", New ControlScheduler(textbox)) _
.Select(Function(a) DirectCast(a.Sender, TextBox).Text) _
.DistinctUntilChanged
End Function
''' <summary>
''' Returns an IObservable(Of Boolean) that fires when the CheckedChanged event fires.
''' </summary>
<Extension()>
Public Function ObserveCheckedChanged(radio As RadioButton) As IObservable(Of Boolean)
Return Observable _
.FromEventPattern(Of EventArgs)(radio, "CheckedChanged", New ControlScheduler(radio)) _
.Select(Function(a) DirectCast(a.Sender, RadioButton).Checked)
End Function
我目的是爲了再能到我的表格上寫的代碼如下:
Dim myObserver = MyTextBox.ObserveTextChanged.Throttle(TimeSpan.FromSeconds(0.3))
myObserver.Subscribe(Function(text) DoSomethingWith(text))
我有一些問題:
- 上午我以正確的方式去做這件事?那是:
- 有沒有人做過類似的事情,並遇到線程/處置問題?
- 我是否需要ControlScheduler,或者我可以在最後附加一個.ObserveOn(控件),還是我需要兩者?
- 或者,我不需要ObserveOn,而應該使用SubscribeOn嗎?
- 這是否已經在WinForms的Rx框架中完成了,我簡單地忽略了它?
更新:
我已經分裂事件捕捉和觀察到兩種不同的擴展方法,以提供用戶更多靈活性的價值。有時候用戶想要改變後的值,有時用戶只想知道值已經改變了。
''' <summary>
''' Returns an IObservable that fires when the TextChanged event fires.
''' </summary>
''' <param name="textbox"></param>
''' <returns></returns>
''' <remarks>It's useful to follow this with .Throttle if you wish to throttle the events.</remarks>
<Extension()>
Public Function ObserveTextChanged(textbox As TextBox) As IObservable(Of Reactive.EventPattern(Of EventArgs))
Return Observable.FromEventPattern(Of EventArgs)(textbox, "TextChanged")
End Function
''' <summary>
''' Returns an IObservable(Of String) that fires when the TextChanged event fires and the text has actually changed.
''' </summary>
''' <param name="textbox"></param>
''' <returns></returns>
''' <remarks>It's useful to follow this with .Throttle if you wish to throttle the events.</remarks>
<Extension()>
Public Function ObserveTextChangedResult(textbox As TextBox) As IObservable(Of String)
'** May need to inject a .ObserveOn(textbox) just before the .Select if we get threading issues.
Return textbox.ObserveTextChanged.Select(Function(a) textbox.Text).DistinctUntilChanged
End Function
''' <summary>
''' Returns an IObservable that fires when the CheckedChanged event fires.
''' </summary>
''' <param name="radio"></param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()>
Public Function ObserveCheckedChanged(radio As RadioButton) As IObservable(Of Reactive.EventPattern(Of EventArgs))
Return Observable.FromEventPattern(Of EventArgs)(radio, "CheckedChanged")
End Function
''' <summary>
''' Returns an IObservable(Of Boolean) that fires when the CheckedChanged event fires.
''' </summary>
''' <param name="radio"></param>
''' <returns></returns>
''' <remarks></remarks>
<Extension()>
Public Function ObserveCheckedChangedResult(radio As RadioButton) As IObservable(Of Boolean)
'** May need to inject a .ObserveOn(radio) just before the .Select if we get threading issues.
Return radio.ObserveCheckedChanged.Select(Function(a) radio.Checked)
End Function
挖掘到RX源,我看到'.ObserveOn(控制)'內部爲我創造了'ControlScheduler'。 – MCattle