当前位置:网站首页 / C#人爱学不学 / 正文

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

时间:2018年12月29日 | 作者 : aaronyang | 分类 : C#人爱学不学 | 浏览: 926次 | 评论 0

开源地址: 前往

学习对象   Rx.NET 和   lx.NET

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


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


创建Observable对象

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

image.png

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

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

image.png

ToObservable();

image.png


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

image.png

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


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

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


image.png


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

接下来看看

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

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


using操作

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

image.png

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

image.png


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

image.png



模仿一个移动

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

image.png

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

image.png



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


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


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

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘C# .NET CORE,vue前端,JAVA开发,有想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui,可以看到我的很多作品效果,私活合作请qq联系我

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表