写给自己的Rx编程-WPF [2]

栏目: ASP.NET · 发布时间: 5年前

内容简介:开源地址:学习对象   Rx.NET 和   lx.NET由于资料英文(github的介绍,demo的单元测试,自己的脑洞),自己学习和理解可能有误,希望有问题提出来,ay提前谢谢你们了。

开源地址: 前往

学习对象   Rx.NET 和   lx.NET

由于资料英文(github的介绍,demo的单元测试,自己的脑洞),自己学习和理解可能有误,希望有问题提出来,ay提前谢谢你们了。

我的测试截图,比较好理解的不啰嗦了

创建Observable对象

IObservable<Int32> source = Observable.Return(42);

写给自己的Rx编程-WPF [2]

产生空的 IObservable<Int32> source = Observable.Empty<Int32>();

范围:IObservable<Int32> source = Observable.Range(10, 5)

写给自己的Rx编程-WPF [2]

ToObservable();

写给自己的Rx编程-WPF [2]

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中的代码

写给自己的Rx编程-WPF [2]

默认在另外一个线程处理结果的,处理完了,就会反馈给 Subscribe中处理。

接下来监听浏览器的,导航完成,消失加载...

 var browser = Observable.FromEventPattern<NavigationEventArgs>(webBrowser1, "Navigated");
            browser.ObserveOn(this.Dispatcher).Subscribe(evt =>
                {
                    lblProgress.Visibility = Visibility.Collapsed;
                }
            );

写给自己的Rx编程-WPF [2]

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

接下来看看

看一些拓展的方法,俗称 操作符

Take,Skip,Distinct和LINQ没区别,不懂的去看LINQ

using操作

Rx对于 清理 受限制资源或者非托管资源,Rx提供了using的方法,去管理这些资源的释放。

写给自己的Rx编程-WPF [2]

比如我们在写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());

写给自己的Rx编程-WPF [2]

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);

写给自己的Rx编程-WPF [2]

模仿一个移动

界面上放一个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>

写给自己的Rx编程-WPF [2]

后台注册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返回

写给自己的Rx编程-WPF [2]

====================www.ayjs.net       杨洋    wpfui.com        ayui      ay  aaronyang=======请不要转载谢谢了。=========

当然还有很多...........用法,在C#的 Task类中也是一大堆学问的方法,很值得学

推荐您阅读更多有关于“Rx,”的文章


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

疯狂的站长

疯狂的站长

温世豪 / 清华大学出版社 / 2010年05月 / 29.00元

受全球性金融危机的影响,就业变得越来越困难,众多青年,包括大学毕业生,无不感到就业的巨大压力,站长这一职业不但创业门槛低,而且还自由自在。其实,搭建一个网站是相当简单的,但要成为一名成功的站长则不那么容易。 本书作者是一名站长,从事互联网相关工作已十余年,自已也在经营一个知名网站,积累了大量网站运营经验。作者结合自身真实的“疯狂”创业经历,以平实、通俗的语言讲述如何从零开始起步,最终成为一名......一起来看看 《疯狂的站长》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

在线进制转换器
在线进制转换器

各进制数互转换器

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具