内容简介:开源地址:学习对象 Rx.NET 和 lx.NET由于资料英文(github的介绍,demo的单元测试,自己的脑洞),自己学习和理解可能有误,希望有问题提出来,ay提前谢谢你们了。
开源地址: 前往
学习对象 Rx.NET 和 lx.NET
由于资料英文(github的介绍,demo的单元测试,自己的脑洞),自己学习和理解可能有误,希望有问题提出来,ay提前谢谢你们了。
我的测试截图,比较好理解的不啰嗦了
创建Observable对象
IObservable<Int32> source = Observable.Return(42);
产生空的 IObservable<Int32> source = Observable.Empty<Int32>();
范围:IObservable<Int32> source = Observable.Range(10, 5)
ToObservable();
System.Threading.Volatile.Write 学习地址: 查看
Enumerable.Range(1, 100)
.ToObservable()
.Subscribe(v => System.Threading.Volatile.Write(ref _store, v));
通过事件创建Observable对象
建立1个空的wpf项目 4.6+ 引用Reactive
<Window x:Class="WpfRxTest.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfRxTest"
mc:Ignorable="d" WindowStartupLocation="CenterScreen"
Title="www.ayjs.net" Height="450" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28" Orientation="Horizontal">
<TextBlock x:Name="PageTitle" Text="搜索" VerticalAlignment="Center" FontSize="32"/>
</StackPanel>
<StackPanel Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<TextBox VerticalContentAlignment="Center" FontSize="16" Name="Search" Text="" HorizontalAlignment="Stretch" Height="38" Margin="10,0"/>
<TextBlock Name="lblSearch" Text="搜索 - " FontSize="14" Margin="10,10"/>
<TextBlock Name="lblProgress" Text="加载..." FontSize="14" Visibility="Collapsed"/>
<WebBrowser Name="webBrowser1" HorizontalAlignment="Stretch" Height="469" VerticalAlignment="Stretch"/>
</StackPanel>
</Grid>
</Window>
我自己折腾出来的。。
后台代码:
private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
Loaded -= MainWindow_Loaded;
var Search_KeyUp = System.Reactive.Linq.Observable.FromEventPattern<KeyEventArgs>(Search, "KeyUp").Throttle(TimeSpan.FromSeconds(1));
Search_KeyUp.ObserveOn(this.Dispatcher).
Subscribe(args => {
if (Search.Text.Length >= 2)
{
lblSearch.Text = "百度百科搜索 - " + Search.Text;
lblProgress.Visibility = Visibility.Visible;
webBrowser1.Navigate(new Uri("https://baike.baidu.com/item/" + Search.Text));
}
});
}
对事件监听,Throttle 进行延迟 搜索,ObserveOn监听在哪个线程执行,我直接界面线程
处理完后,处理结果Subscribe
效果:
文本框输入 内容, 1秒内没有输入东西,输入的东西长度大于2个字符,就会执行Subscribe中的代码
默认在另外一个线程处理结果的,处理完了,就会反馈给 Subscribe中处理。
接下来监听浏览器的,导航完成,消失加载...
var browser = Observable.FromEventPattern<NavigationEventArgs>(webBrowser1, "Navigated");
browser.ObserveOn(this.Dispatcher).Subscribe(evt =>
{
lblProgress.Visibility = Visibility.Collapsed;
}
);
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
接下来看看
看一些拓展的方法,俗称 操作符
Take,Skip,Distinct和LINQ没区别,不懂的去看LINQ
using操作
Rx对于 清理 受限制资源或者非托管资源,Rx提供了using的方法,去管理这些资源的释放。
比如我们在写StreamReader,时候会用到Using{} 包起来,当然我们也可以使用Using这个来处理流
新建一个ay.txt然后尝试读文件
StringBuilder sb = new StringBuilder();
var ObservableStrings = Observable.Using<char, StreamReader>(
() => new StreamReader(new FileStream(Directory.GetCurrentDirectory() + "/ay.txt", FileMode.Open)),
streamReader => (streamReader.ReadToEnd().Select(str => str)).ToObservable()
);
ObservableStrings.Subscribe(a =>
{
sb.Append(a);
}
);
MessageBox.Show(sb.ToString());
Zip操作
LINQ中的Zip是将两个集合合并为一个新的集合,在Rx中Zip是将两个Observable对象合并为一个新的Observable对象。
var listOne = Observable.Range(0, 100);
var listTwo = new String[] { "合肥", "上海", "北京", "天津", "重庆" }.ToObservable();
var numberCitys = listOne.Zip(listTwo, (num, city) => num + ":" + city);
numberCitys.Subscribe(Console.WriteLine);
模仿一个移动
界面上放一个rectangle
<Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Blue" x:Name="cv">
<Rectangle Name="rec"
Fill="Yellow"
Width="100"
Height="100"
Canvas.Left="264"
Canvas.Top="105" />
</Canvas>
后台注册3个事件
var mousedown = Observable.FromEventPattern<MouseButtonEventArgs>(rec, "MouseLeftButtonDown")
.Select(x => x.EventArgs.GetPosition(rec));
var mouseup = Observable.FromEventPattern<MouseButtonEventArgs>(cv, "MouseLeftButtonUp");
var mousemove = Observable.FromEventPattern<MouseEventArgs>(cv, "MouseMove")
.Select(x => x.EventArgs.GetPosition(cv));
var q = from start in mousedown
from end in mousemove.TakeUntil(mouseup)
select new
{
X = end.X - start.X,
Y = end.Y - start.Y
};
q.Subscribe(value =>
{
Canvas.SetLeft(rec, value.X);
Canvas.SetTop(rec, value.Y);
});
因为你的每次移动都会导致q的改变,所以就会触发Subscribe的逻辑
TakeUntil 是等待另一个序列返回,这里等待mouseup返回
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
当然还有很多...........用法,在C#的 Task类中也是一大堆学问的方法,很值得学
推荐您阅读更多有关于“Rx,”的文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 写给自己的Rx编程[1]
- 254 页 PPT!这是一份写给 NLP 研究者的编程指南
- 写给自己的Kettle笔记1
- 写给自己的Kettle笔记3
- 写给自己的Kettle笔记2
- 写给自己的Kettle笔记4
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
RGB转16进制工具
RGB HEX 互转工具
图片转BASE64编码
在线图片转Base64编码工具