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


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

查看所有标签

猜你喜欢:

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

Big Java Late Objects

Big Java Late Objects

Horstmann, Cay S. / 2012-2 / 896.00元

The introductory programming course is difficult. Many students fail to succeed or have trouble in the course because they don't understand the material and do not practice programming sufficiently. ......一起来看看 《Big Java Late Objects》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具