写给自己的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,”的文章


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

查看所有标签

猜你喜欢:

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

国际大学生程序设计竞赛例题解

国际大学生程序设计竞赛例题解

郭嵩山 / 电子工业出版社 / 2006-5 / 32.0

《国际大学生程序设计竞赛例题解1:数论、计算几何、搜索算法专集》可以作为高等院校有关专业的研究生和本科学生参加国际大学生程序设计竞赛的辅导教材,也可作为高等院校有关专业相关课程的教材和教学参考书,也比较适合作为中学青少年信息学奥林匹克竞赛省级及省级以上优秀选手备战信息学奥林匹克竞赛的培训教材及训练题集。一起来看看 《国际大学生程序设计竞赛例题解》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试