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


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

查看所有标签

猜你喜欢:

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

用户故事地图

用户故事地图

Jeff Patton / 李涛、向振东 / 清华大学出版社 / 2016-4-1 / 59.00元

用户故事地图作为一种有效的需求工具,越来越广泛地应用于开发实践中。本书以用户故事地图为主题,强调以合作沟通的方式来全面理解用户需求,涉及的主题包括怎么以故事地图的方式来讲用户需求,如何分解和优化需求,如果通过团队协同工作的方式来积极吸取经验教训,从中洞察用户的需求,开发真正有价值的、小而美的产品和服务。本书适合产品经理、用户体验设计师、产品负责人、业务分析师、IT项目经理、敏捷教练和精益教练阅读和......一起来看看 《用户故事地图》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码