财经

行使MVVM-Sidekick开发Universal App(一)财经

19 3月 , 2019  

财经 1

原先的WP7多语言必要本身搞第一次全国代表大会坨代码,到了WP8方便了好几,VS会扶助干很多事。但到了Universal,情状又变了。WP8添加财富文件的时候能源文件格式为resx,同时程序会自行抬高2个AppResouces.Designer.cs,通过三个大局的ResourceManager去取得能源文件中的字符串,代码中得以平素调用:

说起看综合艺术节目,作者平日会养成关联搜索和同类对待的习惯。比如芒果台经典的兴奋大学本科营,平时会与每日向上相比,即便是一个台的剧目。但是风格和价值观迥然分化。开心大学本科营从始至终都以在玩乐、搞笑;完全没有更加多少深度层次的交换和沟通。有时候玩的游乐令人难堪症发作。那TM是侮辱嘉宾的智力商数照旧蔑视客官的智力商数呀!由此也引得网上海人民广播电视台湾大学高端人员的谩骂和思疑,从搜狐到贴吧到微博音信跟帖。四处在贬低着这些无脑节目,说欣赏看的都以脑残。
 即便如此,可本身还是认为快本于本人有恩。在自家单独在家无聊的时候,作者看一期,能够笑叁个多时辰,赶走无聊。在自作者工作压力巨大,啥都不想干的时候,看一期,能权且驱走压力,几乎比疼痛时的活血片还有效。在作者与同事无话可谈的时候,聊聊快本,我们都能急忙的热络起来,气氛马上活跃,感觉境遇了亲切一般。在自己和胞妹搭讪的时候,说到爱雅观的剧目,必有快本,你们从原本的狼狈和生疏,立刻就足以无话不谈,就看打开了话匣子,唠唠叨叨。作者爱快本,即便很无脑,可是有时作者确实希望做2个无脑的人呀!人生已如此困难,大家就毫无再拆穿了,喜欢就好。

这样会自动建立二个MultilingualResources文件夹,里面是一大坨xlf后缀的公文,qps-ploc.xlf那么些是伪语言,用于测试的,在任何的多少个文件上点右键,采取打开药方式,选用多语言编辑器,出来那样2个东东:

自笔者能够说是个长情的综合艺术谜。看综合艺术节目成了漫漫平时生活必备的一项娱乐,首要程度可与每一日进食穿衣卓殊。每日不管是不是工作日和周五,早晨不可不看一期综合艺术节目。有时候因为本人热爱的剧目尚未立异而深感很烦心,比没吃饭,买不到好吃的佳肴,看不到美景,见不到地道姑娘还痛楚。

本来有不可胜道条件编写翻译啊,通过这种方法来分别Win8.1和WP8.1,有点坑啊。

大部人皆以奔着汪涵和欧弟(Ou Di)去看的,当然也要迷妹去看小五的,也有个别钱枫的听众去看看他是怎么在戏台犯贱的。

http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/jj572370.aspx

现今全体成员娱乐、娱乐至死的时代,哪个人都或多或少看过几档综合艺术节目,有娱乐的,访谈的,真人秀的,喜剧类的,益智答题的,歌唱类的。

右键单击CurrencyExchanger.WindowsPhone,选用添加翻译语言,

快本

把那么些VM作为Grid的DataContext,这样就能够开始展览绑定了,能够看出有叁个TextBlock的Text属性绑定到了VM的Title字段。

每一天兄弟

追根究底要一往直前Universal的大坑了,还有点小感动啊。

即使随时改版换主持人,可是依然会每期守着它,每期不可不看。他们的节目是每一周二期的视觉盛宴,能让深思发人深省同时也令人捧腹大笑。

货币转换这些app效率正是从雅虎财政和经济获取不一致的货币代码直接的汇率,因而首先来建立相应的Model。

财经 2

 

跑男

四 、初阶化数据

计算。在那一个压力横行,房价日了狗,物价飞涨,房租超贵的时代。假诺每一天不看点综合艺术节目对生活加以调节。必然会对生存充满绝望,轻则苦恼,重则自杀。

财经 3财经 4

每2十三日向上让自个儿感触到知识在其余2个时候都不行关键!

AllCurrencyItemList = new List<CurrencyItem>()
            { 
                new CurrencyItem{Code = "AED", Description = AppResources.AED, Image="flag_united_arab_emirates"},
new CurrencyItem{Code = "ALL", Description = AppResources.ALL, Image="flag_albania"},
//new CurrencyItem{Code = "ANG", Description = AppResources.ANG, Image=""},
new CurrencyItem{Code = "ARS", Description = AppResources.ARS, Image="flag_argentina"},
。。。。。
}

财经 5

CurrencyExchanger 掌中汇率是自身前年宣布在Windows
Phone商店中的贰个利用,当时是WP7版本,下载链接:http://www.windowsphone.com/zh-cn/store/app/%E6%8E%8C%E4%B8%AD%E6%B1%87%E7%8E%87free/84e93a20-cefb-460f-b0d9-a57689b33c10

汪涵,壹其中专生,从小小的广播台杂工干起,历经几年的打磨,终于有了神跡得来的二次主办机会,从此小心主持十几年。也得以猜到,主持的十几年肯定也是深浅学习的十年。从诗词歌赋,历史人文,方言古迹到观念文化、待人接物,他无一不通。甚至都嘉宾的经验、心理都一目掌握。每一回看到她的发提问和总计,都感觉到是一项措施,给人很爽快的感到。他是一名国内盛名的主席,更是一名崇高文化艺术的召集人。

多语言财富文件的增长比较不难,有工具中国包装技协理,甚至翻译都足以帮您办好,具体步骤见

欧弟(英文名:ōu dì)是2个自带搞笑光环的人,任何业务,由她说来,必然令人捧腹大家。他是每一日的热情洋溢果更是大家忠实观者的戏谑果。

然后三个初阶化方法:

感激网络和科学技术,以及许多TV工小编给大家那么些小伙子枯燥无味的活着进献了一档档歌声绕梁,兴致盎然的剧目。让我们的生活,不只是前面包车型客车苟且,还希冀着前途的异域。

添加多语言文件倒不费事,有多语言工具包,链接:http://msdn.microsoft.com/zh-cn/library/windows/apps/xaml/jj572370.aspx

真人秀节目看得相比较多,不过依然只对《阿爹去哪儿》和《跑男》情有独钟。不为其余,只是梦想见到光鲜靓丽的歌唱家们日常的平常生活都是什么的!究竟他们也是人,以满足下自身的好奇心。当然也有十分光滑稽的地点,孩子们也很纯情。跑男的通力合营精神值得学习。其余的节目如;《阿爹回到了》、《极限挑战》、《极速前进》、《了不起的挑衅》、《真心豪杰》、《大家穿越吧》、《歌唱家到作者家》、《全员加快成人中学学》、《偶像来了》、《搦战者结盟》、《花儿与妙龄》、《花样男子团队》都只是当作板凳人员,偶尔看一看,缓解对《父亲去何方》和《跑男》的感怀之情。

 

再有越来越多赏心悦目的脱口秀说话节目。《逻辑思考》、《水星秀》、《明早80后脱口秀》、《晓说/晓松奇谈》、《壹周立波秀》、《奇葩说》、《黑白星球》、《梁文道先生传说汇》、《看不错-一千零一夜》、《金星情报局》、《袁sir-袁角/袁游》、《百家讲坛》、《吴晓波频道》、《财政和经济郎眼》、《作者是演讲家》、《锵锵两其中国人民银行》、《非凡静距离》、《鲁豫有约》等。每当自个儿心态不佳的时候,恐怕希望听到外人讲旧事,拓展眼界的时候,以上的剧目就足以全面包车型大巴帮本人化解难题了。就算腾讯网上诸多黑以上有个别节目,可是觉得是协调的,别人说哪些不重庆大学。究竟和讯上的答主超过一半都是牛人,他们无需这么些调剂生活,大家屌丝的活着情形他们怎能意识到,就像大家不可能获悉他们的生存一样嘛。最欢愉的正是《逻辑思考》、《晓说/晓松奇谈》、《奇葩说》。《逻辑思考》每回都能够教会小编换多少个角度看难点,看难题要看根本,分析最原始的原因。那样能够让投机平素自收缩伤心,从根本方面去全力,奋斗。而《晓说/晓松奇谈》就像周周为我讲一期轶事大概分享温馨所见所闻的泰斗,用她那接地气,通俗的言语讲述她所知。所见。所感的人和事,讲到了诸多小编本来不知底的事,大概井底之蛙恐怕具有颠覆的事。比如大肆批判洪秀全和康南海是妄人,颠覆作者的世界观了,以前觉得康怎么说也毫无疑问是先进分子吧!不至于落3个疯子的骂名。可是掌握到历史事实,真的当之无愧3个人渣。60000万亲生的天数岂能是你1位之言、独断专行、台风骤雨似的改正所能快捷转移的?《奇葩说》教会自己乐怎么着更有逻辑的讲话,让别人更便于听懂作者说的话。让自个儿认识到讲话也是一门艺术。说话说得好,做什么样事都能更轻松更有底气。

接下来我们找到相应的文书看一下,

View Code

概念了2个财富,把VM引入进来。

var loader = new Windows.ApplicationModel.Resources.ResourceLoader();
var string = loader.GetString('Farewell');
public sealed class Context
    {
        static readonly Context instance = new Context();

        static Context()
        {

        }

        private Context()
        {
        }



        /// <summary>
        /// Gets the instance.
        /// </summary>
        /// <value>The instance.</value>
        public static Context Instance
        {
            get
            {
                return instance;
            }
        }
}
public static void RunAllConfig()
        {

            typeof(StartupFunctions)
                    .GetRuntimeMethods()
                    .Where(m => m.Name.StartsWith("Config") && m.IsStatic)
                    .Select(                      
                        m => m.Invoke(null, Enumerable.Empty<object>().ToArray()))
                    .ToArray();

        }

是否很坑?万一字符串写错了就找不到了。

public void Init()
        {
            AllCurrencyItemList = new List<CurrencyItem>()
            { 
                new CurrencyItem{Code = "AED", Description ="阿联酋迪拉姆", Image="flag_united_arab_emirates"},
new CurrencyItem{Code = "ALL", Description = "阿尔巴尼亚列克", Image="flag_albania"},
……
}

其一Model要继承BindableBase<CurrencyItem>,在MVVM-Sidekick中BindableBase是和ViewModelBase一样重要的多少个基类,用于落到实处可绑定的model,但差异是ViewModelBase中还会放一些Command,而BindableBase顾名思义仅用于绑定属性,不提议在中间放Command这几个东西。不要看下面这么一大坨,其实就输入了多少个单词而已,都以用propvm生成的。首要是八个性子,货币代码,描述,图片名称。图片用于在体现货币的时候显得多少个国旗的图片。

内需注意的是,在此以前的方法必要大家为各个语言建立四个财富文件,未来有多语言工具包就不须求了,只添加一个默许语言的即可,工具包会自动填充别的的语言。比如CurrencyExchanger默许语言是法语,那么步骤正是:

大体的项目布局正是这么,上面我们就初始升高。说是升级,其实正是双重开发啊5555

在OnLaunched方法中,有如此一行:

 public class CurrencyItem : BindableBase<CurrencyItem>
    {
        /// <summary>
        /// 货币代码
        /// </summary>
        public string Code
        {
            get { return _CodeLocator(this).Value; }
            set { _CodeLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property string Code Setup
        protected Property<string> _Code = new Property<string> { LocatorFunc = _CodeLocator };
        static Func<BindableBase, ValueContainer<string>> _CodeLocator = RegisterContainerLocator<string>("Code", model => model.Initialize("Code", ref model._Code, ref _CodeLocator, _CodeDefaultValueFactory));
        static Func<string> _CodeDefaultValueFactory = () => { return default(string); };
        #endregion

        /// <summary>
        /// 描述
        /// </summary>
        public string Description
        {
            get { return _DescriptionLocator(this).Value; }
            set { _DescriptionLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property string Description Setup
        protected Property<string> _Description = new Property<string> { LocatorFunc = _DescriptionLocator };
        static Func<BindableBase, ValueContainer<string>> _DescriptionLocator = RegisterContainerLocator<string>("Description", model => model.Initialize("Description", ref model._Description, ref _DescriptionLocator, _DescriptionDefaultValueFactory));
        static Func<string> _DescriptionDefaultValueFactory = () => { return default(string); };
        #endregion

        /// <summary>
        /// 图片名称
        /// </summary>
        public string Image
        {
            get { return _ImageLocator(this).Value; }
            set { _ImageLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property string Image Setup
        protected Property<string> _Image = new Property<string> { LocatorFunc = _ImageLocator };
        static Func<BindableBase, ValueContainer<string>> _ImageLocator = RegisterContainerLocator<string>("Image", model => model.Initialize("Image", ref model._Image, ref _ImageLocator, _ImageDefaultValueFactory));
        static Func<string> _ImageDefaultValueFactory = () => { return default(string); };
        #endregion


    }
public class CurrencyExchangeItem : BindableBase<CurrencyExchangeItem>
    {
        /// <summary>
        /// 日期
        /// </summary>
        public DateTime TradeDate
        {
            get { return _TradeDateLocator(this).Value; }
            set { _TradeDateLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property DateTime TradeDate Setup
        protected Property<DateTime> _TradeDate = new Property<DateTime> { LocatorFunc = _TradeDateLocator };
        static Func<BindableBase, ValueContainer<DateTime>> _TradeDateLocator = RegisterContainerLocator<DateTime>("TradeDate", model => model.Initialize("TradeDate", ref model._TradeDate, ref _TradeDateLocator, _TradeDateDefaultValueFactory));
        static Func<DateTime> _TradeDateDefaultValueFactory = () => { return default(DateTime); };
        #endregion

        /// <summary>
        /// 汇率
        /// </summary>
        public double Rate
        {
            get { return _RateLocator(this).Value; }
            set { _RateLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property double Rate Setup
        protected Property<double> _Rate = new Property<double> { LocatorFunc = _RateLocator };
        static Func<BindableBase, ValueContainer<double>> _RateLocator = RegisterContainerLocator<double>("Rate", model => model.Initialize("Rate", ref model._Rate, ref _RateLocator, _RateDefaultValueFactory));
        static Func<double> _RateDefaultValueFactory = () => { return default(double); };
        #endregion

        /// <summary>
        /// 逆向汇率
        /// </summary>
        public double InverseRate
        {
            get { return _InverseRateLocator(this).Value; }
            set { _InverseRateLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property double InverseRate Setup
        protected Property<double> _InverseRate = new Property<double> { LocatorFunc = _InverseRateLocator };
        static Func<BindableBase, ValueContainer<double>> _InverseRateLocator = RegisterContainerLocator<double>("InverseRate", model => model.Initialize("InverseRate", ref model._InverseRate, ref _InverseRateLocator, _InverseRateDefaultValueFactory));
        static Func<double> _InverseRateDefaultValueFactory = () => { return default(double); };
        #endregion

        /// <summary>
        /// 是否为基准货币
        /// </summary>
        public bool IsStandard
        {
            get { return _IsStandardLocator(this).Value; }
            set { _IsStandardLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property bool IsStandard Setup
        protected Property<bool> _IsStandard = new Property<bool> { LocatorFunc = _IsStandardLocator };
        static Func<BindableBase, ValueContainer<bool>> _IsStandardLocator = RegisterContainerLocator<bool>("IsStandard", model => model.Initialize("IsStandard", ref model._IsStandard, ref _IsStandardLocator, _IsStandardDefaultValueFactory));
        static Func<bool> _IsStandardDefaultValueFactory = () => { return default(bool); };
        #endregion


        /// <summary>
        /// 货币数量
        /// </summary>
        public double Amount
        {
            get { return _AmountLocator(this).Value; }
            set { _AmountLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property double Amount Setup
        protected Property<double> _Amount = new Property<double> { LocatorFunc = _AmountLocator };
        static Func<BindableBase, ValueContainer<double>> _AmountLocator = RegisterContainerLocator<double>("Amount", model => model.Initialize("Amount", ref model._Amount, ref _AmountLocator, _AmountDefaultValueFactory));
        static Func<double> _AmountDefaultValueFactory = () => { return default(double); };
        #endregion


        /// <summary>
        /// 基准货币
        /// </summary>
        public CurrencyItem CurrencyBase
        {
            get { return _CurrencyBaseLocator(this).Value; }
            set { _CurrencyBaseLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property CurrencyItem CurrencyBase Setup
        protected Property<CurrencyItem> _CurrencyBase = new Property<CurrencyItem> { LocatorFunc = _CurrencyBaseLocator };
        static Func<BindableBase, ValueContainer<CurrencyItem>> _CurrencyBaseLocator = RegisterContainerLocator<CurrencyItem>("CurrencyBase", model => model.Initialize("CurrencyBase", ref model._CurrencyBase, ref _CurrencyBaseLocator, _CurrencyBaseDefaultValueFactory));
        static Func<CurrencyItem> _CurrencyBaseDefaultValueFactory = () => { return default(CurrencyItem); };
        #endregion

        /// <summary>
        /// 目标货币
        /// </summary>
        public CurrencyItem CurrencyTarget
        {
            get { return _CurrencyTargetLocator(this).Value; }
            set { _CurrencyTargetLocator(this).SetValueAndTryNotify(value); }
        }
        #region Property CurrencyItem CurrencyTarget Setup
        protected Property<CurrencyItem> _CurrencyTarget = new Property<CurrencyItem> { LocatorFunc = _CurrencyTargetLocator };
        static Func<BindableBase, ValueContainer<CurrencyItem>> _CurrencyTargetLocator = RegisterContainerLocator<CurrencyItem>("CurrencyTarget", model => model.Initialize("CurrencyTarget", ref model._CurrencyTarget, ref _CurrencyTargetLocator, _CurrencyTargetDefaultValueFactory));
        static Func<CurrencyItem> _CurrencyTargetDefaultValueFactory = () => { return default(CurrencyItem); };
        #endregion

    }
public static class AppResources
    {
        public static ResourceLoader CurrentResourceLoader
        {
            get
            {
                return ResourceLoader.GetForCurrentView();
            }
        }

        public static string AppName
        {
            get
            {
                return CurrentResourceLoader.GetString("AppName");
            }
        }
。。。。。。
}

在内部添加1个列表:

 

以此办法对View和ViewModel实行了配备,以后新加View的话,MVVM-Sidekick会自动添加所需的ViewModel,并在那一个类中展开挂号,方便使用。

 

CurrencyExchanger.Shared

财经 6财经 7

萧萧,先别管翻译的准不准,代码里大家得以那样开始化货币列表了:

 

看来菜单没有,点翻译,Microsoft
Translator直接就帮你翻译好了。当然还亟需进一步兵高核对,但早已很智能化了。那样就不要求为各类语言建财富文件了,能够从那么些xlf文件里找。必要专注的是,假诺你的程序选取了zh-CN的暗许语言,就无法再有zh-CN.xlf的多语言能源,不然会提示错误,删掉重复的即可。你也足以在xlf文件上右键发送邮件给心上人,翻译完了再导入进来。

未完待续。

打开Package.appxmanifest文件,把私下认可语言改成en-US,然后添加2个Strings文件夹,下边添加en-US文件夹,添加三个Resources.resw财富文件,在那中间编辑所需求的字符串。

在用户率先次进入app时,应该让用户挑选要来得怎么钱币的汇率,那样就要给用户提供1个货币列表,那一个列表须要大家提前开首化好。

假如保险那里写对,那样现在调用的时候就不怕出错了。

String appName = AppResources.AppName;
<Page.Resources>
        <!-- TODO: Delete this line if the key AppName is declared in App.xaml -->

        <vm:MainPage_Model x:Key="DesignVM"/>
    </Page.Resources>

CurrencyExchanger.Windows

如今得以新建项目了,选拔通用应用程序,MVVM-Sidekick Universal
App项目模板,输入CurrencyExchanger,等待VS建立项目。这几个地方有个必要留意,项目名称无法太长,小编先是次输入了三个相比较长的名字,结果VS提醒名称太长,建立战败了。

 

然后看MainPage_Model.cs这几个vm,那一个类继承了ViewModelBase<MainPage_Model>,ViewModelBase是MVVM-Sidekick的主要性的1个类,全部的vm都要继续那几个类。里面有一个脾气Title,能够看看还带着一大坨代码,这一大坨代码是怎么出去的啊,MVVM-Sidekick提供了代码段来援救转移,所以这正是安装VS扩大的好处。

 

 

我使用了MVVM-Sidekick框架,那是1个简单但功效强大的MVVM框架,由微软的@韦恩卑鄙 开发,作者一贯用这几个框架开发WP8的次序,前不久小编升级支撑了Universal
App。

 

 

github:https://github.com/waynebaby/mvvM-Sidekick

//Init Context
Context.Instance.Init();

因为是从财富文件中读取的货币描述,所以在UI会呈现和用户系统同盟的语言。

然后大家看CurrencyExchanger.WindowsPhone项目中的MainPage.xaml,里面有这么一行:

 

 

壹 、新建项目

CurrencyExchanger.WindowsPhone

经过输入 propvm
,按Tab,就会自动生成一个属性,能够方便的绑定到View上了。

财经 8财经 9

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"  DataContext="{StaticResource DesignVM}">
        <TextBlock TextWrapping="Wrap" x:Name="pageTitle" Grid.Column="1"  Text="{Binding Title}" Style="{StaticResource HeaderTextBlockStyle}"/>
    </Grid>

新建项如今须求先安装MVVM-Sidekick的VS扩张插件,在VS二零一三update2的工具-扩充与创新菜单中搜索mvvm-sidekick就足以找到这几个扩充,下载安装即可。安装后会添加项目模板和代码段,比较有利。

//Init MVVM-Sidekick Navigations:
Startups.StartupFunctions.RunAllConfig();

贰 、项目布局

丰盛钱币列表是三个很干燥的工作,当初本人是从雅虎财政和经济网页上扒下的钱币代码,又从网页素材网站找到国旗的图形,挨个整理好。当然也足以先行整理成xml来读取。

 

View Code

3、建立所需的Model

慢着,小编的WP7程序正是帮忙多语言的,此时自然不能够把货币描述间接hard code,而应当从能源文件中服从用户日前的言语来展现。

五 、可以叫环球化多语言本地化……反正正是足以让用户挑选语言

财经 10

以此model便是用来突显货币汇率转换的,里面有多少个货币的信息还有汇率的音信等等。

vs插件:http://visualstudiogallery.msdn.microsoft.com/ef9b45cb-8f54-481a-b248-d5ad359ec407

方今得以见到VS二零一一为我们转移了三个体系,

public List<CurrencyItem> AllCurrencyItemList { get; set; }

能够看来大家耳熟能详的App.xaml文件被内置了Shared项目中,打开看一下,

在CurrencyExchanger.Shared项目中新建一个Models文件夹,添加二个CurrencyItem.cs,内容如下:

到了Universal里,自动生成的远非了,添加的能源文件格式变成了resw,须求用那种方法来调用:

好吧又多了一个难点,多语言。

View Code

找到App.xaml.cs,在OnLaunched方法中调用此措施:

 

只是调用显得不太融洽。所以作者仿照WP8的形式新建了3个AppResources.cs,放到Utilities,里面这么写:

与此类似再建立多少个货币转换的model,新建CurrencyExchangeItem.cs文件,代码如下:

新建一个Context类,放一些常用的东东。在Shared项目中新建Utilities目录,添加3个Context.cs文件,做成单例。

财经,ViewModel文件夹中放着所需的VM,那个文件夹也是在Shared项目中,表明大家能够只用共享的VM去作为差别平台的View的DataContext,落成了共享代码的目的。

是或不是很有利?

#if WINDOWS_PHONE_APP
        private TransitionCollection transitions;
#endif

财经 11

早就很久没有升级了,近来想上学一下Universal开发,就拿那几个练练手吧。此前平素从未系统的写过小说,今后始于把开发中的一些进程记录一下,也是对友好的1个促进。因为是边做边写,肯定会有不当,请大家不吝赐教。

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图