业余时间写的一个知乎日报win10版客户端,支持收藏,评论,点赞等。

商店地址:https://www.microsoft.com/zh-cn/store/apps/%E5%A4%A9%E5%A4%A9%E8%AF%BB%E6%8A%A5/9nblggh5fx8z

开源地址:https://github.com/brookshi/UWP_ZhiHuRiBao 欢迎fork/star。

先上图:

PC版:

Mobile版:

磁贴:

引用的一系列的库:

阴影:https://github.com/brookshi/XPShadow

网络:https://github.com/brookshi/XPHttp

列表:https://github.com/brookshi/LLMListView

内部通信:https://github.com/brookshi/LLQNotifier

按钮:https://github.com/brookshi/XPButton

动画:https://github.com/brookshi/LLMAnimator

新浪微博登录:http://weibowinrtsdk.codeplex.com/

API是通过用Fiddler抓取Android版知乎日报获得。

这个应用比较有意思的点:

1.文章显示

文章api获取的是一串html,自然想到用webview来显示,不过打开一个文章就用一个webview,占用内存比较大。为解决这个问题,开始尝试将html转成xaml,用RichTextBox显示。用的是: https://github.com/stimulant/SocialStream/blob/master/XAMLConverter/HtmlToXamlConverter.cs

可惜不能支持所有html节点,而且image显示很慢,字体显示怪异,效果不佳,放弃。

回到webview,既然是多个webview造成内存大,那只用一个webview不就可以了! 嗯,单例模式。

每次打开文章时把这个静态的webview单例从Parent中移除,再加到当前Page中。

 public static class WebViewUtil
{
static WebViewUtil()
{
_webViewInstance.ScriptNotify += async (s, e) =>
{
string data = e.Value;
if (!string.IsNullOrEmpty(data) && data.StartsWith(Html.NotifyPrex))
{
await Launcher.LaunchUriAsync(new Uri(data.Substring(Html.NotifyPrex.Length)));
}
};
} private readonly static object _parentLocker = new object(); private readonly static List<Panel> _webViewParents = new List<Panel>(); private readonly static WebView _webViewInstance = new WebView(); public static void AddWebViewWithBinding(Panel parent, object source, string path)
{
Clear();
RemoveParent();
_webViewInstance.SetBinding(WebViewExtend.ContentProperty, new Binding() { Source = source, Path = new PropertyPath(path) });
lock(_parentLocker)
{
parent.Children.Add(_webViewInstance);
if (!_webViewParents.Contains(parent))
{
_webViewParents.Add(parent);
}
}
} public static void Clear()
{
_webViewInstance.NavigateToString("");
} public static bool IsParent(Panel panel)
{
return panel.Children.Contains(_webViewInstance);
} public static bool HasParent { get { return _webViewInstance.Parent is Panel; } } public static void RemoveParent()
{
lock(_parentLocker)
{
_webViewParents.ForEach(panel =>
{
if (panel.Children.Contains(_webViewInstance))
panel.Children.Remove(_webViewInstance);
});
}
}
}
2.布局

WinRT支持根据一些条件来显示不同的布局,最常用的就是AdaptiveTrigger,通过设置MinWindowWidth/MinWindowHeight来显示/隐藏元素来展示不同的布局。

<VisualState>
<VisualState.StateTriggers>
<AdaptiveTrigger MinWindowWidth="{Binding Source={StaticResource Config}, Path=MinWidth_UIStatus_ListAndContent}" />
</VisualState.StateTriggers>
<VisualState.Setters>
<Setter Target="StoryContentView.IsPaneOpen" Value="false" />
<Setter Target="StoryContentView.DisplayMode" Value="Overlay" />
</VisualState.Setters>
</VisualState>

但是有时候条件不单单是Width/Height,还需要其他条件来决定布局,这时可以模仿AdaptiveTrigger创建一个我们自己的StateTrigger。自定义的trigger需要继承StateTriggerBase,加入其他条件ExtraCondition,通过SizeChanged的事件来触发Trigger。

  public class AdaptiveTriggerExtended : StateTriggerBase
{
public double MinWindowWidth
{
get { return (double)GetValue(MinWindowWidthProperty); }
set { SetValue(MinWindowWidthProperty, value); }
}
public static readonly DependencyProperty MinWindowWidthProperty =
DependencyProperty.Register("MinWindowWidth", typeof(double), typeof(AdaptiveTriggerExtended), new PropertyMetadata()); public bool ExtraCondition
{
get { return (bool)GetValue(ExtraConditionProperty); }
set { SetValue(ExtraConditionProperty, value); }
}
public static readonly DependencyProperty ExtraConditionProperty =
DependencyProperty.Register("ExtraCondition", typeof(bool), typeof(AdaptiveTriggerExtended), new PropertyMetadata(true)); private FrameworkElement _targetElement;
public FrameworkElement TargetElement
{
get { return _targetElement; }
set
{
_targetElement = value;
_targetElement.SizeChanged += (s, e) => SetActive(ExtraCondition && e.NewSize.Width >= MinWindowWidth);
}
}
}
3.微博登录

官方知乎日报登录肯定有自己的AppID和AppSecret,这个不太好找(其实也能找到,把android版日报反编译,细心点就可以找到),不过发现用我自己从微博申请的也可以用。

官方推荐的win8 SDK,在win10也可以用。

4.Popup Message

Win10里Toast是把消息发到消息中心,对应用内部提示不是很友好,这里我用Popup模拟了一下android的toast。

思路是生成一个包含TextBlock的Popup,把要弹出的消息push到一个queue里,按顺序弹出消息,遇到相同的就跳过。

具体实现代码这里就不贴了,可以参考PopupMessage.cs

其他引用的库如阴影,按钮,列表等就放到后面再写。

知乎日报win10版 - 天天读报【开源】的更多相关文章

  1. 【完全开源】知乎日报UWP版(下篇):商店APP、github源码、功能说明。Windows APP 良心出品。

    目录 说明 功能 截图+视频 关于源码和声明 说明 陆陆续续大概花了一个月的时间,APP算是基本完成了.12月份一直在外出差,在出差期间进行了两次功能完善,然后断断续续修补了一些bug,到目前为止,我 ...

  2. 【完全开源】知乎日报UWP版(上篇):界面设计、官方API分析

    目录 说明 使用Fiddler分析android版API 部分效果图 关于源码 说明 在做博客园UWP版的时候其实就有做知乎日报的打算了,前段时间一直出差,在酒店里用Fiddler简单的分析了一下An ...

  3. 【完全开源】知乎日报UWP版:增加Live磁贴、Badge、以及Toast通知

    目录 说明 实现方法 APP生命期 后台任务 说明 之前网上有人建议增加磁贴(tile).徽章(badge)功能.利用周末的时间,将这两个功能添加上去了.如果将磁贴固定到开始屏幕,磁贴就会循环播放首页 ...

  4. 【完全开源】知乎日报UWP版:项目结构说明、关键源代码解释

    目录 说明 项目结构 关键代码 演示视频 说明 上一篇博客将源码放出来了,但是并没有做过多的介绍,所以如果自己硬看可能需要花费很长的时间,尤其这些代码并不是自己写的.项目不算复杂但是也不算简单,这篇文 ...

  5. 【开源】知乎日报UWP 更新

    说明 大概十天之前我更新了一次APP,后来又仔细看了一下Store里的评论,发现还有几个地方没有改过来.于是前天晚上抽时间改了一下,顺便完善了一下UI体验. 没有看前面文章的童鞋可以看一下下面的链接: ...

  6. React-Native运行知乎日报遇到的问题

    研究几天RN(React-Native)后,跟着官方的demo做了一下电影图片显示的那个,但是总感觉官方的demo欠缺点什么,所以找来找去找到了RN版的知乎日报,话说知乎日报什么版的都有,不信你们上网 ...

  7. 一个知乎日报pwa

    前几天写了一篇文章关于如何实现一个简单版的pwa应用,端午撸了一个简易版知乎日报pwa. 关于如何写一个pwa,这里就不多介绍了,请移步这里.应用使用vue+vuex+axios,API这里,这里做了 ...

  8. android翻译应用、地图轨迹、视频广告、React Native知乎日报、网络请求框架等源码

    Android精选源码 android实现高德地图轨迹效果源码 使用React Native(Android和iOS)实现的 知乎日报效果源码 一款整合百度翻译api跟有道翻译api的翻译君 RxEa ...

  9. 微信小程序开发日记——高仿知乎日报(下)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...

随机推荐

  1. SSRS 的简单使用(一)

    简介 SQL Server Reporting Services(SSRS),微软企业级报表平台,和SQL Server Integration Service以及SQL Server Analysi ...

  2. 《CLR via C#》读书笔记--基元类型、引用类型和值类型

    编程语言的基元类型 编译器直接支持的数据类型称为基元类型.基元类型直接映射到Framework类库中存在的类型.例如:C#中的int直接映射到System.Int32类型.下表给出了C#基元类型与对应 ...

  3. solrconfig.xml介绍

    说明:请务必先了解如下知识,否则阅读本文会晕. Solr术语介绍:SolrCloud,单机Solr,Collection,Shard,Replica,Core之间的关系 Solr通过三个主要文件来作配 ...

  4. Java查询大文本

    但JAVA本身缺少相应的类库,需要硬编码才能实现结构化文件计算,代码复杂且可读性差,难以实现高效的并行处理. 使用免费的集算器可以弥补这一不足.集算器封装了丰富的结构化文件读写和游标计算函数,书写简单 ...

  5. MySQL入门(四)

    我好久没有写这个系列了,也确实不知道写什么.回首我学习数据库的路,最开始搞Oracle的时候其实没有搞懂Oracle,也不知道学了什么,后来学习MySQL尤其是InnoDB才大概入了门了.我最开始学习 ...

  6. 前端构建工具gulp介绍

    2016年3月3日 10:46:08     晴 前端构建工具gulpjs的使用介绍及技巧 gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简 ...

  7. 设计模式C#实现(十二)——装饰模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 动态的给一个对象添加一些额外的职责. 适用性 动态的为单个对象添加职责而不影响其他对象 处理那些可以撤销的职责(? 在某些功能不需要 ...

  8. mysql备份还原

    备份java代码如下: /** * 备份单个数据库 * @param dbName 数据库名称 * @return 备份成功或者失败 */ @Override public boolean backu ...

  9. android Unhandled exception type ParseException提示报错

    Unhandled exception type ParseException 意思指:你有一个方法会抛出异常,但是你没有捕捉. 依提示添加一下即可解决:

  10. mapred-site.xml 配置在线更新

    环境:ibm jdk , cdh2.35.0.2 需求:更新mapred-site.xml 中的mapreduce.map.java.opts 和 mapreduce.reduce.java.opts ...