• RX实例——ObservableAsPropertyHelper


    使用ObservableAsPropertyHelper将Observables转化为Properties

    使用WhenAny方法,可以监视对象属性的变化,并针对这些变化生成IObservable对象。但是有时候,我们想将这些生成的IObservable对象设置为一种输出属性。想象一下有这样一个场景,有一个取色器,用户能够通过3个Slide分别设置R,G,B值。每一个Slide可以使用ViewModel对象来表示,取值范围为0到255。为了显示结果,我们需要将RGB合成为一个XAML颜色对象。当RGB中的任何一个发生变化时,我们需要更新颜色属性。

        实战效果:

    实战代码

     前端xaml很一般:
    <Grid x:Name="LayoutRoot" Background="White">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="auto"/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="R(red):" HorizontalAlignment="Right"/>
            <Slider x:Name="RedSlider" Orientation="Horizontal" SmallChange="1"  Maximum="255"  Width="100" Grid.Column="1" Value="{Binding Redvalue,Mode=TwoWay}" />
            <TextBlock Text="G(green):" Grid.Row="1" Grid.Column="0" HorizontalAlignment="Right"/>
            <Slider x:Name="GreenSlider"  Grid.Row="1" Grid.Column="1" Orientation="Horizontal" SmallChange="1"  Maximum="255"  Width="100" Value="{Binding Greenvalue,Mode=TwoWay}"/>
            <TextBlock Text="B(blue):" HorizontalAlignment="Right"  Grid.Row="2" Grid.Column="0" />
            <Slider x:Name="BlackSlider"  Grid.Row="2" Grid.Column="1" Orientation="Horizontal" SmallChange="1"  Maximum="255"  Width="100" Value="{Binding Bluevalue,Mode=TwoWay}"/>
            <Rectangle Fill="{Binding FinalColor,Mode=TwoWay}" Width="100" Height="109" Grid.Row="3" Grid.ColumnSpan="2"/>
        </Grid>
    xaml

    ViewModel代码:

        public class MainPageViewModel : ReactiveObject
        {
            public MainPageViewModel()
            {
                IObservable<SolidColorBrush> color = this.WhenAny(x => x.Sumvalue, x => x.Redvalue, x => x.Greenvalue, x => x.Bluevalue, (a, r, g, b) =>new SolidColorBrush(Color.FromArgb(255, r.Value, g.Value, b.Value)));
                _finalColor = color.ToProperty(this, x => x.FinalColor);
            }
            #region Proerty
            public ObservableAsPropertyHelper<SolidColorBrush> _finalColor;
            public SolidColorBrush FinalColor
            {
                get { return _finalColor.Value; }
            }
    
            [IgnoreDataMember]
            public byte _sumvalue;
            public byte Sumvalue
            {
                get { return _sumvalue; }
                set { this.RaiseAndSetIfChanged(x => x.Sumvalue, value); }
            }
            [IgnoreDataMember]
            public byte _redvalue;
            public byte Redvalue
            {
                get { return _redvalue; }
                set { this.RaiseAndSetIfChanged(x => x.Redvalue, value); }
            }
    
            [IgnoreDataMember]
            public byte _greenvalue;
            public byte Greenvalue
            {
                get { return _greenvalue; }
                set { this.RaiseAndSetIfChanged(x => x.Greenvalue, value); }
            }
    
            [IgnoreDataMember]
            public byte _bluevalue;
            public byte Bluevalue
            {
                get { return _bluevalue; }
                set { this.RaiseAndSetIfChanged(x => x.Bluevalue, value); }
            }
            #endregion
        }
    ViewModel
    在学习RX中,WPF和Silverlight的环境是有区别的:
    1. WPF引用RX的dll可以直接在nuget中下载,而silverlight必须去官网下前一版本的。嫌费事可直接下载我的xap包引用。
    2. WPF中的类库远远大于silverlight的,例如上面的例子Color类,读者可自行msdn比较。
     
    设置变量格式:
           private void Application_Startup(object sender, StartupEventArgs e)
            {
                Func<string, string> UnderscoreFirstToLowerBehaviour = x =>
                {
                    char[] arr = x.ToCharArray();
                    arr[0] = char.ToLower(arr[0]);
                    return '_' + new String(arr);
                };
                RxApp.GetFieldNameForPropertyNameFunc = UnderscoreFirstToLowerBehaviour;
    
                this.RootVisual = new MainPage();
            }
    APP.CS
     
  • 相关阅读:
    java对象序列化机制
    进程和线程的区别
    关于Java中的String类的不可变
    计算机编码ASCII、UNICODE和UTF-8
    mybatis中的一级缓存和二级缓存
    SQL语句之EXSITS谓词
    git学习笔记
    hdu1542-扫描线求矩形面积并
    首场ACM总结——2019JXCPC(CCPC江西省省赛)
    hdu1199(离散化线段树)
  • 原文地址:https://www.cnblogs.com/luqixinhe/p/3231902.html
Copyright © 2020-2023  润新知