CozyRSS开发记录19-窗口标题栏交互

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CozyRSS开发记录19-窗口标题栏交互相关的知识,希望对你有一定的参考价值。

CozyRSS开发记录19-窗口标题栏交互

1、谈谈对mvvm解耦的看法

在使用mvvm时,如何操作窗口,这是一个问题。这个问题的关键点是:mvvm是把viewviewmodel解耦了的,很多写法一不小心又把它们耦合起来了。

那么,viewviewmodel解耦有什么好处,不解偶又有什么坏处呢?我这里也不深入讨论了,只说一个场景:CozyRSS假使要做android版和ios版了,我的model和处理的库肯定是不用改的,那viewmodel需要改吗?

前面说到,mvvmlight是跨平台的,本身是可以在xamarin里用的。那么,理想的情况是,我只需要重写view,修改控件和布局,内容和命令依然是绑定在viewmodel上的。那么问题来了,viewmodel如果依赖了view,那就非改不可了。

举一个这样的例子:

 技术分享

这是SO上某个答主的答案,如何在用mvvm的情况下,实现窗口拖动。这里view并没有什么问题,绑定到命令。接下来看viewmodel

 技术分享

这里,viewmodel依赖到Window了,换View的时候,非改不可了。

针对这种情况,有几种处理方法:依赖属性、消息...不管哪种方法,总之,就是让viewmodel在不知道view的情况下,通知view做点事情。我用了另外一种取巧的方法,提供一些Actions类,Actions会依赖view,而viewmodel依赖Actions。虽然viewmodel依然多了依赖,但是移植时,只需要考虑到这些需要修改的Actions,而不用动viewmodel,而需要修改的依赖viewActions是很少的。

2、Actions

我们需要让标题栏支持:窗口拖动、双击最大化。对应的代码很简单:

 技术分享

然后让viewmodel依赖这些Actions,而不依赖view

 技术分享

3、绑定事件

最后,我们用EventTrigger来绑定下两个事件:

 技术分享

至此,窗口标题栏支持拖动和双击最大化就完成了。

以上是关于CozyRSS开发记录19-窗口标题栏交互的主要内容,如果未能解决你的问题,请参考以下文章

CozyRSS开发记录21-默认RSS源列表

CozyRSS开发记录16-RssContentView显示

CozyRSS开发记录14-RSS源管理初步完工

CozyRSS开发记录17-Html2Xaml

谈谈用户体验中的表单设计-理论篇

简单谈谈js中的MVC